另请参阅:readdir的"0"如何在while条件下不是false?.(不重复;只是密切相关.)
它在文档中的哪个位置说测试readdir的定义性?例如,这段代码
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dir, "/tmp" or die "$!";
while (my $file = readdir($dir)) {
print "$file\n";
}
closedir $dir;
Run Code Online (Sandbox Code Playgroud)
当运行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
Run Code Online (Sandbox Code Playgroud)
我期待这种行为,但我找不到它的指定位置.在perlop的I/O运算符部分,它说
以下行是等效的:
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
Run Code Online (Sandbox Code Playgroud)
通源来看,Perl_newWHILEOP在op.c明确有测试readdir,glob,readline和each...嗯,让我们做一些挖掘,看看当readdir加入.
稍微挖掘一下git就会发现,至少自1998年以来一直如此,Gurusamy Sarathy在承诺方面做出了相关的改变55d729e4.虽然我还没有去挖掘哪些版本已经进入,但我打赌它至少会达到5.6.0及以上.在三角洲中我找不到它.
它可能会在第三版骆驼书中提到,但我还没有检查过.
我认为这里的补丁(甚至只是p5p的一个注释)肯定会受到赞赏.
保罗