我通常使用以下代码遍历文件中的行:
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while ( my $line = <$fh> ) {
...
}
Run Code Online (Sandbox Code Playgroud)
然而,在回答另一个问题时,Evan Carroll编辑了我的答案,将我的while陈述改为:
while ( defined( my $line = <$fh> ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
他的理由是,如果你有一条线0(它必须是最后一条线,否则它将有一个回车)然后while如果你使用我的声明你将会过早退出($line将被设置为"0",并且返回值来自因此,赋值也将"0"被评估为错误).如果检查已定义,则不会遇到此问题.这很有道理.
所以我试了一下.我创建了一个文本文件,其最后一行0没有回车符.我在循环中运行它并且循环没有过早退出.
然后我想,"啊哈,也许这个价值实际上并不0存在,也许那里还有别的事情搞砸了!" 所以我使用Dump()了Devel::Peek,这就是它给了我的东西:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV …Run Code Online (Sandbox Code Playgroud)