2009-05-09 3 views
6

参照:Where in the documentation does it say that while tests readdir for definedness?。 (ない重複;ちょうど密接に関連し。)whiled条件でreaddir()の "0"の結果がfalseにならないのはどうですか?


多くの人々がとして慣用以下のループ処理:おそらく後者であるため

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

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

の代わりにバージョンがファイル名が "0"(ゼロ)の場合、ループを終了するはずですが、ファイルがなくなると 'undef'を返します。

しかし、これまでのある時点で、defined()のこのテストは必要なくなりました。後者のバージョンが関係なく動作するようにする特別なケースコードがあるようです。

これはどのように動作しますか?私が代わりにfoo()を呼び出してreaddir()への呼び出しを置き換える場合

不思議なことに、:がループを私が期待する何をすべきか、そして終了しない

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

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

、コードファイルは0」という名前のとき" 見つかった。

(MacOS Xの10.5.6にはPerl 5.8.9でテスト済み)

答えて

11

それは魔法です。具体的には、魔法(perlsynperlopなど、私は覚えていないかもしれません。 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が見ているコードを取得: - 誰かが提供できる場合は本当に参考になるBのための

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 
+3

+1を::逆パースここ速記ループを使用してファイルがあります特定のドキュメントへのリンク。私は人間のperlsynでそれを見つけることができません。 – Alnitak

+0

B :: Deparseをクリックしてperlsynをクリックすると、動作を文書化しているperlsynのセクションが表示されます(より明示的に書かれたバージョンのPerlのショートハンドを探してください)。どこかに良い文書がありますが、私はどこにいるのか覚えていません。 –

+0

これをカバーするperlopセクションへのリンクを追加しましたが、readdirが同じ扱いを受ける理由についての特定のドキュメントはまだありません。 –

関連する問題