另请参阅:文档中的哪些内容表示测试readdir的定义性?.(不重复;只是密切相关.)
许多人将下面的循环视为惯用语:
while (defined(my $file = readdir($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
代替:
while (my $file = readdir($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
因为假设文件名只是"0"(零),所以应该使用后一版本,它应该终止循环,而当没有更多文件时它返回'undef'.
但是在过去的某个时刻,这个测试已经defined()停止了必要 - 似乎有一些特殊的案例代码允许后一个版本无论如何都能工作.
我想知道这是如何工作的?
奇怪的是,如果我更换调用readdir()与调用foo()来代替:
sub foo
{
my ($dir) = @_;
return readdir($dir);
}
while (my $file = foo($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
那么代码确实做了我期望的事情,并在找到名为"0"的文件时终止循环.
(在MacOS X 10.5.6上使用Perl 5.8.9进行测试)