gpt4 book ai didi

perl - 在一段时间内readdir()产生的 “0”如何不为假?

转载 作者:行者123 更新时间:2023-12-04 13:45:41 27 4
gpt4 key购买 nike

另请参阅:Where in the documentation does it say that while tests readdir for definedness?。 (不是重复的;只是紧密相关。)

很多人认为以下循环是惯用的:

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

关于perl - 在一段时间内readdir()产生的 “0”如何不为假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com