0

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

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 的帖子后,我才意识到如果不切碎 eq 会失败,因为循环的实际字符串是 Team 42\n。这就是为什么我的问题与其他 chomp 问题不同的原因:我不知道为什么我的代码在没有 chomp 的情况下无法正常工作,并且有人为我指明了正确的方向。

4

3 回答 3

2

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

KallolSobriquechomp解释了为什么代码没有执行您想要的操作:保留一个新行,因此不匹配(没有新行的字符串),因此文件被读取到最后并返回真的。参见 chomp(或)。正如你所说,我没有看到脚本“抛出错误”。它不适合我,不管有没有“chomp”;它只是从不匹配。$_eofperldoc -f chomp

甚至还有另一个错误chomp,如123所述:如果匹配的字符串是文件中的最后一行,则在找到匹配项时,文件已被读取,因此eof返回 true,您会得到一个字符串不是成立。例如,您可以通过使用标志来修复(您在那里拥有),在这种情况下,您将不再通过eof任何方式来决定。

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

于 2016-02-17T09:08:02.630 回答
2

如果您不咀嚼,您只需要更改匹配以包含新行。

while(<$fh>) {
  last if($_ eq "Team $team_number\n");
}
于 2016-02-17T09:10:10.280 回答
0

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

于 2016-02-17T09:48:14.967 回答