5

参照:while条件でreaddirの「0」が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;

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/OOperatorsセクション

次の行は同等です。

     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テストがあります。readdirglobreadlineeachreaddir

を少し掘り下げてgitみると、少なくとも 1998 年以降はそうだったことがわかり、Gurusamy Sarathy が commit で関連する変更を行っています55d729e4。どのリリースが入っているかを掘り下げることはしていませんが、少なくとも 5.6.0 以降であることに賭けたいと思います。デルタでそれについての言及が見つかりません。

ラクダ本第3版に記載されているかもしれませんが、調べていません。

ここでのパッチ (または p5p への単なるメモ) は確かに高く評価されると思います。

ポール

于 2009-05-10T15:14:53.953 に答える