首页 > 解决方案 > if(!$_) 的含义

问题描述

我在 Perl 中有一个正在读取文件的脚本。在某些时候,代码会在 for 循环中使用以下 if 语句:

for (my $i = 0; $i<10 ; $i++ ) {

    $_ = <INPUT>;
    if (!$_) {last;} 
    
...

我是 Perl 的新手,所以我想知道 !$_ 的含义。在这个例子中,$_ 是我文件的一行。那么,该行对 if 语句应该有什么内容是真实的。

标签: perl

解决方案


条件,即ifinside ,在布尔标量上下文()中进行评估,以测试“真实性”。所以如果它是or (empty string) or (or string ) 它是假的。undef''0"0"

!否定了它后面的内容,if (!$_)如果$_为假(undef''0"0"),则为真。但是,在这种情况下,它是从运算符$_分配的,所以它总是在末尾有一个换行符——除非源 for已经用尽,在这种情况下返回。<><><>undef

因此,在这种情况下,它会if (!$_)测试是否没有更多可读取的内容INPUT,并在出现这种情况时退出for循环last

对所示代码的一些评论。

  • 该 C 风格的for循环也可以写成for my $i (0..9),这被认为更好,更易读。†</sup> 请参阅foreach,并真正关注流量控制关键字的链接

  • 一段代码

    $_=<INPUT>
    if (!$_) { last; }
    ...
    

    一旦文件结束,从INPUT文件句柄中读取并退出其循环(见最后)。(这不需要是一个实际的文件,而是任何可以通过文件句柄读取的资源。)

    至少可以说,这很笨拙;一种常见的做法是

    while (<INPUT>) {
        ...
    }
    

†</sup> 如此之多,以至于现在即使是硬核编译语言也拥有它。C++11介绍了基于范围的for循环

for (auto var: container) ...  // (really, const auto&), or auto&, or auto&&

上面链接的标准参考资料说

用作更易读的等价于传统for循环 [...]


推荐阅读