{{我通常使用以下代码循环遍历文件中的行:}}
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while ( my $line = <$fh> ) {
...
}
然而,在回答另一个问题时, Evan Carroll 修改了我的答案,将我的 while
语句改为:
while ( defined( my $line = <$fh> ) ) {
...
}
他的理由是,如果你有一行是
0
(它必须是最后一行,否则它将有一个回车符),那么如果你使用我的语句($line
将被设置为"0"
,并且赋值返回值也将是"0"
,这将被评估为false),那么你的while
会过早退出。如果你检查定义,则不会遇到这个问题。这很有道理。所以我试了一下。我创建了一个文本文件,其最后一行是没有回车符的
0
。我通过我的循环运行它,循环没有过早退出。然后我想,"啊哈,也许这个值实际上不是
0
,也许还有其他东西搞砸了!"于是我使用了Devel::Peek
中的Dump()
,它给了我这个:SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0X962600 "0"\0
CUR = 1
LEN = 80
那似乎告诉我该值实际上是字符串
"0"
,因为如果我对一个明确设置为"0"
的标量调用Dump()
,我会得到类似的结果(唯一的区别在于LEN字段——从文件LEN为80,而从标量LEN为8)。那么怎么回事呢?如果我传递一个没有回车符的只有
"0"
的行给while()
循环,为什么它不会过早退出?Evan的循环是否更加严谨,或者Perl内部是否做了一些疯狂的事情,意味着你不需要担心这些问题,while()
实际上只有在遇到eof
时才会退出?