if(!$_)的含义

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

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

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

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

回答

if条件,里面是什么(),在评估布尔标量环境的被测试“感实性。” 所以如果它是undef''(空字符串)或0(或字符串"0")它是假的。

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

因此,在这种情况下,它会if (!$_)测试是否没有更多内容可供读取INPUT,如果是forlast则退出循环。

对显示的代码的一些评论。

  • 那个 C 风格的for循环也可以写成for my $i (0..9),这被认为更好,更易读。 参见foreach,并真正按照流程控制关键字的链接

  • 一段代码

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

    INPUT文件句柄读取并在出现文件结尾时退出其循环(见最后)。(这不必是实际文件,而是可以通过文件句柄读取的任何资源。)

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

    while (<INPUT>) {
        ...
    }
    

以至于即使是硬核编译语言现在也拥有它。在C++11介绍了基于范围的for循环

上面链接的标准参考说

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

  • @HenriqueToste Great, I'm glad you like it 🙂 Let me know if more would be helpful or if questions pop up later.

以上是if(!$_)的含义的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>