也可以看看:readdir 的“0”结果在 while 条件下如何不为 false? https://stackoverflow.com/questions/843430/how-is-0-result-from-readdir-not-false-in-a-while-condition. (不重复;只是密切相关。)
文档中哪里说 while 测试 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::离开 http://perldoc.perl.org/B/Deparse.html yields:
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
我期望这种行为,但我找不到指定它的位置。在里面perlop 的 I/O 操作符部分 http://perldoc.perl.org/perlop.html#I%2fO-Operators it says
以下几行是等效的:
while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while defined($_ = <STDIN>);
print while ($_ = <STDIN>);
print while <STDIN>;
但没有提到readdir
.
你说得对,没有记录下来。我仔细查找过,也找不到任何关于它有什么特别的地方。它is正如您所发现的,并且如以下所证明的那样,很特别:
$ 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
in op.c
特别有测试readdir
, glob
, readline
and each
... 嗯,让我们进行一些挖掘,看看什么时候readdir
加入。
稍微挖掘一下git
透露至少从 1998 年开始就是这样,Gurusamy Sarathy 在提交中进行了相关更改55d729e4
。虽然我还没有深入了解哪些版本已进入,但我打赌至少会是 5.6.0 及更高版本。我在三角洲找不到任何提及它的信息。
It might第三版骆驼书里有提到,但我还没查过。
我认为这里的补丁(或者甚至只是 p5p 的注释)肯定会受到赞赏。
Paul
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)