readdir()から「0」は、しばらくの状態でどのように偽りではありませんか?
-
20-08-2019 - |
質問
参照: ドキュメントのどこで、それは定義のために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
所属していません StackOverflow