readdir()から「0」は、しばらくの状態でどのように偽りではありませんか?

StackOverflow https://stackoverflow.com/questions/843430

質問

参照: ドキュメントのどこで、それは定義のためにReaddirをテストしますか?. (複製されていません。ちょうど密接に関連しています。)


多くの人々が以下のループを慣用的なものとして扱います:

while (defined(my $file = readdir($dir)) {
    ...
}

それ以外の:

while (my $file = readdir($dir)) {
    ...
}

おそらく後者のバージョンでは、ファイル名が「0」(ゼロ)の場合、ループを終了する必要がありますが、ファイルがなくなると「UNDEF」を返します。

しかし、過去のある時点でこのテスト defined() 必要に応じて停止 - 後者のバージョンを機能させる特別なケースコードがあるようです。

これがどのように機能するか知りたいですか?

不思議なことに、電話を交換する場合 readdir() 電話があります foo() 代わりは:

sub foo
{
    my ($dir) = @_;
    return readdir($dir);
}

while (my $file = foo($dir)) {
    ...
}

次に、コード します 私が期待することをして、「0」という名前のファイルが見つかったときにループを終了します。

(MacOS x 10.5.6でPerl 5.8.9でテストされています)

役に立ちましたか?

解決

それは魔法です。具体的には魔法(で文書化されています perlsyn, perlop, 、そしておそらく私が覚えていない他の場所)。 Perlは、特定の速記表記を許可します。 Perlが背中の後ろで何をしているのかを見たい場合は、使用できます B::Deparse. 。これは、速記ループを使用するファイルです。

#!/usr/bin/perl

use strict;
use warnings;

opendir my $dir, "/tmp" or die "$!";

while (my $file = readdir($dir)) {
    print "$file\n";
}

走ったら perl -MO=Deparse filename.pl あなたはPerlが見るコードを取得します:

use warnings;
use strict 'refs';
die "$!" unless opendir my $dir, '/tmp';
while (defined(my $file = readdir $dir)) {
    do {
        print "$file\n"
    };
}
filename.pl syntax OK
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top