这个节目
use warnings;
use strict;
use feature qw(say);
{
#use autodie; # all good when this is uncommented
no autodie;
}
open my $OLDSTD, '>&', *STDOUT; #--> line 10 (program fails)
open *STDOUT, '>', 'stdout.out';
say "$$ done";
中止与
Undefined subroutine called at problem_no_autodie.pl line 10.
重述代码中的注释:如果有use autodie;
先声明然后一切都好。 (一切都很好,只有use autodie;
)奇怪的是,在相同的范围内no autodie
声明我也没有看到这样的问题;只有超出其范围的代码才会失败!有点反作用域,是吗?
如果这个范围no autodie
comes after指某东西的用途*STDOUT
然后一切又好了。进一步利用*STDOUT
,之后(范围)no autodie
,程序失败。
有一个Gotcha https://perldoc.perl.org/autodie.html#GOTCHAS在涉及裸字的文档中提到(我不完全理解),并且该程序确实失败了STDOUT
——但我把它当作*STDOUT
.
所以看来*STDOUT
被视为用户的子目录,但我不明白这一点,也不明白其范围如何autodie
被击败。 (范围泄漏在某些版本中被称为错误,但以看似无关的方式。)这有一个实际问题。
我不使用autodie
在我的代码中。但考虑一下我确实使用的这个子
sub isatty {
no autodie;
state $isatty = open(my $tty, '+<', '/dev/tty');
return $isatty;
}
这是合法的open
失败,所以我们必须禁用autodie
在该范围内,以防潜艇的用户打开它。那么所描述的行为会造成伤害吗?什么情况下?
我对这个效果感到困惑no autodie
以及它超出其范围的泄漏,以及所有奇怪的细节。但真正关心的是,我不确定如何保护使用像上面这样的库的代码免受这种行为的影响,因为我不理解它。有任何想法吗?
我在 CentOS 7.8 上的 5.16.3(系统)、5.26.2 和 5.30.0(perlbrew)下看到了这个
I do not在 5.32.0 上看到此行为;那里没有失败。
The ... or die $!
检查与open
没有任何区别,因此为了简单起见没有显示。