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,如果是for,last则退出循环。
对显示的代码的一些评论。
-
那个 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.