5

另请参阅:readdir 的“0”结果如何在一段时间内不为假?. (不是重复的;只是密切相关。


它在文档中的什么地方说在测试 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

我期待这种行为,但我找不到它的指定位置。在perlop 的 I/O Operators 部分中,它说

以下几行是等效的:

     while (defined($_ = <STDIN>)) { print; }
     while ($_ = <STDIN>) { print; }
     while (<STDIN>) { print; }
     for (;<STDIN>;) { print; }
     print while defined($_ = <STDIN>);
     print while ($_ = <STDIN>);
     print while <STDIN>;

但没有提及readdir

4

2 回答 2

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 在 commit 中做出了相关的更改55d729e4。虽然我还没有深入了解哪些版本进入了,但我敢打赌它至少会是 5.6.0 及更高版本。我在三角洲中找不到任何提及。

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

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

保罗

于 2009-05-10T15:14:53.953 回答
2

很抱歉,我没有考虑更新您希望找到此信息的页面。

我确实在尽管的readdir部分添加了注释。perlfunc

readdir从 Perl 5.12 开始,您可以在循环中使用 bare while,它将$_在每次迭代时设置。

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

它没有明确说它检查定义性。

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

于 2014-01-20T22:42:21.587 回答