加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – readdir()的“0”如何在while条件下不是false?

发布时间:2020-12-15 22:02:55 所属栏目:大数据 来源:网络整理
导读:另见: Where in the documentation does it say that while tests readdir for definedness?.(不重复;只是密切相关.) 许多人将下面的循环视为惯用语: while (defined(my $file = readdir($dir)) { ...} 代替: while (my $file = readdir($dir)) { ...} 因
另见: 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’.

但是,在过去的某个时刻,对定义()的测试停止了必要 – 似乎有一些特殊的案例代码允许后一版本无论如何都能工作.

我想知道这是如何工作的?

奇怪的是,如果我用调用foo()替换对readdir()的调用:

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 "$filen";
}

如果您运行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 "$filen"
    };
}
filename.pl syntax OK

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读