相关疑难解决方法(0)

使用Perl循环遍历文件中的行的最具防御性的方法是什么?

我通常使用以下代码遍历文件中的行:

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)

perl defensive-programming while-loop

14
推荐指数
2
解决办法
5303
查看次数

标签 统计

defensive-programming ×1

perl ×1

while-loop ×1