它在文档中的哪个位置说测试readdir的定义性?

时间:2009-05-10 03:26:34

标签: perl perldoc

另见: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

2 个答案:

答案 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专门针对readdirglobreadlineeach进行了测试...嗯,让我们进行一些挖掘,看看何时添加了readdir

git的一些挖掘表明,至少从1998年开始就是这样,Gurusamy Sarathy在提交55d729e4中进行了相关更改。虽然我还没有去挖掘哪些版本已经进入,但我打赌它至少会达到5.6.0及以上。我无法在三角洲中找到它。

可能会在第三版骆驼书中提到,但我还没有检查过。

我认为这里的补丁(甚至只是p5p的一个注释)肯定会受到赞赏。

答案 1 :(得分:2)

对不起,我没想到要更新您希望找到此信息的页面。

我确实在readdirperlfunc部分添加了注释。

  

从Perl 5.12开始,您可以在readdir循环中使用裸while   每次迭代都设置$_

opendir(my $dh, $some_dir) || die;
while(readdir $dh) {
    print "$some_dir/$_\n";
}
closedir $dh;

它没有明确表示它会检查定义。

(我想请注意,添加此功能是我对Perl核心的第一个补丁。)