perl - if(!$_) 的含义
问题描述
我在 Perl 中有一个正在读取文件的脚本。在某些时候,代码会在 for 循环中使用以下 if 语句:
for (my $i = 0; $i<10 ; $i++ ) {
$_ = <INPUT>;
if (!$_) {last;}
...
我是 Perl 的新手,所以我想知道 !$_ 的含义。在这个例子中,$_ 是我文件的一行。那么,该行对 if 语句应该有什么内容是真实的。
解决方案
条件,即if
inside ,在布尔标量上下文()
中进行评估,以测试“真实性”。所以如果它是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
循环 [...]
推荐阅读
- html - 使用 Flex Box 使一些盒子垂直和水平
- javascript - 根据在另一个下拉列表中选择的值填充下拉列表
- apache - Apache RewriteMap 无法找到外部文件中存在的 url
- java - org.springframework.web.bind.annotation.ResponseStatus 和 org.springframework.http.HttpStatus 不存在
- python - 从 Pandas 系列中提取“url”值
- mysql - 这个查询有什么问题?我正在尝试创建一个带有一些主 ID 的练习小表来进行匹配,但我在这里找不到错误
- machine-learning - 深度学习中的训练/推理术语与一般 ML 中的训练/测试有什么不同吗?
- php - 如何创建一个 SQL 查询,在其中我可以使用 WHERE & AND 子句选择一列的最大数量
- node.js - 使用 Nodejs 创建 PDF 将其发送给带有 AJAX 响应的客户端
- java - 如何使用 Java Api 在 ElasticSearch 中进行布尔查询?