另见:
How is “0” result from readdir not false in a while condition?.(不重复;只是密切相关.)
它在文档中的哪个位置说测试readdir的定义性?例如,这段代码
#!/usr/bin/perl use strict; use warnings; opendir my $dir,"/tmp" or die "$!"; while (my $file = readdir($dir)) { print "$file\n"; } closedir $dir;
当通过B::Deparse收益率时:
use warnings; use strict 'refs'; die "$!" unless opendir my $dir,'/tmp'; while (defined(my $file = readdir $dir)) { do { print "$file\n" }; } z.pl Syntax OK
我期待这种行为,但我找不到它的指定位置.在I/O Operators section of perlop它说
The following lines are equivalent:
while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while defined($_ = <STDIN>);
print while ($_ = <STDIN>);
print while <STDIN>;
但是没有提到readdir.
解决方法
你对它没有证件你是对的.我看起来相当努力,我也找不到任何特殊的参考.正如您所发现的那样,这是特别的,并且如下所示:
$perl -MO=Deparse \ -E'opendir(my $dir,"."); while($_ = readdir($dir)) { say; }' BEGIN { $^H{'feature_say'} = q(1); $^H{'feature_state'} = q(1); $^H{'feature_switch'} = q(1); } opendir my $dir,'.'; while (defined($_ = readdir $dir)) { say $_; } -e Syntax OK
通过源代码,op.c中的Perl_newWHILEOP专门针对readdir,glob,readline和每个进行测试…嗯,让我们做一些挖掘,看看何时添加了readdir.
使用git进行一些挖掘后发现,至少从1998年开始就是这样,Gurusamy Sarathy在提交55d729e4时进行了相关更改.虽然我还没有去挖掘哪些版本已经进入,但我打赌它至少会达到5.6.0及以上.在三角洲中我找不到它.
它可能会在第三版骆驼书中提到,但我还没有检查过.
我认为这里的补丁(甚至只是p5p的一个注释)肯定会受到赞赏.
保罗