gpt4 book ai didi

perl - 使用 Filehandle 和 while 循环定义的用法

转载 作者:行者123 更新时间:2023-12-01 09:04:51 25 4
gpt4 key购买 nike

在阅读一本关于高级 Perl 编程的书时(1),我偶然发现这段代码:

while (defined($s = <>)) {
...

这里使用defined有什么特殊原因吗? documentation forperlop说:

In these loop constructs, the assigned value (whether assignment is automatic or explicit) is then tested to see whether it is defined. The defined test avoids problems where line has a string value that would be treated as false by Perl, for example a "" or a "0" with no trailing newline. If you really mean for such values to terminate the loop, they should be tested for explicitly: [...]

那么,会不会有一个角落案例,或者仅仅是因为这本书太旧了并且在最近的 Perl 版本中添加了自动 defined 测试?


(1) 高级 Perl 编程,第一版,Sriram Srinivasan。奥莱利(1997)

最佳答案

Perl 有很多隐含的行为,比大多数其他语言要多得多。 Perl 的座右铭是There's More Than One To Do It,因为有很多隐含的行为,通常有不止一种方法来表达完全相同的事情。

/foo/ instead of $_ =~ m/foo/

$x = shift instead of $x = shift @_

while (defined($_=<ARGV>)) instead of while(<>)

etc.

使用哪种表达方式很大程度上取决于您本地的编码标准和个人喜好。更明确的表达方式提醒读者幕后的真实情况。这可能会或可能不会提高代码的可读性——这取决于受众的知识程度以及您是否使用众所周知的习语。

在这种情况下,隐式行为比看起来要复杂一些。有时 perl将隐式执行 defined(...)测试 readline 运算符的结果:

$ perl -MO=Deparse -e 'while($s=<>) { print $s }'
while (defined($s = <ARGV>)) {
print $s;
}
-e syntax OK

但有时不会:

$ perl -MO=Deparse -e 'if($s=<>) { print $s }'
if ($s = <ARGV>) {
print $s;
}
-e syntax OK

$ perl -MO=Deparse -e 'while(some_condition() && ($s=<>)) { print $s }'
while (some_condition() and $s = <ARGV>) {
print $s;
}
-e syntax OK

假设您担心这种隐式行为应该处理的极端情况。你有没有 promise perlop内存,以便您了解 Perl 何时使用此隐式行为,何时不使用?您了解 Perl v5.14 和 Perl v5.6 在这种行为上的区别吗?阅读您的代码的人会理解吗?

同样,关于何时使用更显式的表达式没有正确或错误的答案,但当隐式行为更深奥时,使用显式表达式的情况更强大。

关于perl - 使用 Filehandle 和 while 循环定义的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com