在此 Perl 脚本中使用 chomp

Use of chomp in this Perl script

我正在尝试学习 Perl here,教程在阅读一些文件后建议使用以下代码片段:

my $team_number = 42;
my $filename = 'input.txt';

open(my $fh, '<', $filename) or die "cannot open '$filename' $!";

my $found;
while(<$fh>) {
  chomp;
  last if($_ eq "Team $team_number");
}
die "cannot find 'Team $team_number'" if(eof $fh);

不过我不太明白为什么我们需要 chomp。 chomp 删除新行。所以在每个循环中我们删除行尾的新行,但为什么呢?如果删除 chomp,脚本确实会抛出错误,但我不明白为什么。

我明白 chomping 的作用,但我不明白为什么必须进行匹配,因为我们已经遍历了所有行 - 为什么您还需要删除新行?只有在阅读了 Kallol 的 post 之后,我才意识到 eq 如果不被 chomped 就会失败,因为实际循环的字符串是 Team 42\n。所以这就是为什么我的问题与其他 chomp 问题不同:我不知道为什么我的代码没有 chomp 就不能工作,有人给我指出了正确的方向。

当您加载文本并使用它时,您不想要换行是合理的。新行将文本组织到一个文件中,在内存中你有数组或其他数据结构。您不必 必须 chomp 它,您通常想要。

chomp 解释了为什么代码在没有 chomp 的情况下无法按预期执行:$_ 中保留了一个换行符,因此不匹配(没有新行的字符串)所以文件被读取到最后并且 eof returns 为真。看 chomp(或perldoc -f chomp)。不过,正如您所说,我没有看到脚本 "throws an error"。它不适合我,有或没有“chomp”;它永远不会匹配。

即使使用 chomp 也会出现另一个错误,如 123 所述:如果匹配字符串是文件中的最后一行,则在找到匹配项时文件已经如此阅读 eof returns true 并且您会得到一条声明,指出未找到该字符串。例如,您可以通过使用标志(您就在那里)来修复,在这种情况下,您将不再通过 eof 做出决定。

那将是一件非常好的事情,因为您现在所拥有的逻辑有点扭曲(而且相当脆弱!)——当然,这正是最后一行错误的产生原因。

如果您不喜欢的话,您只需要更改匹配以包含一个新行。

while(<$fh>) {
  last if($_ eq "Team $team_number\n");
}

当您遍历文件的每一行时,Chomp 会从行尾删除换行符。由于您正在将行与没有换行的文本进行匹配,因此找不到匹配项并且文件将被读取到最后。所以检查文件结束的最后一个条件为真,"die" 语句被执行。