另见: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中说
以下几行是等效的:
while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while defined($_ = <STDIN>);
print while ($_ = <STDIN>);
print while <STDIN>;
但没有提到readdir
。
答案 0 :(得分:6)
你对它没有证件你是对的。我看起来相当努力,我也找不到任何特殊的参考。正如你所发现的那样是特别的,并且如下所示:
$ 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
查看来源,Perl_newWHILEOP
中的op.c
专门针对readdir
,glob
,readline
和each
进行了测试...嗯,让我们进行一些挖掘,看看何时添加了readdir
。
对git
的一些挖掘表明,至少从1998年开始就是这样,Gurusamy Sarathy在提交55d729e4
中进行了相关更改。虽然我还没有去挖掘哪些版本已经进入,但我打赌它至少会达到5.6.0及以上。我无法在三角洲中找到它。
可能会在第三版骆驼书中提到,但我还没有检查过。
我认为这里的补丁(甚至只是p5p的一个注释)肯定会受到赞赏。
保
答案 1 :(得分:2)