在这个Perl脚本中使用chomp

时间:2016-02-17 08:58:16

标签: perl chomp

我正在尝试学习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的帖子之后,才意识到eq如果没有被扼杀就会失败,因为循环的实际字符串是团队42 \ n。这就是为什么我的问题与其他问题有所不同的原因:我不知道为什么我的代码不能正常工作,有人指出我正确的方向。

3 个答案:

答案 0 :(得分:2)

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

KallolSobrique解释了为什么代码没有按照chomp的说明执行的操作:$_中的新行仍然存在匹配(没有换行的字符串),所以文件读到最后,eof返回true。看到 chomp(或perldoc -f chomp)。正如你所说,我没有看到脚本“抛出错误”。无论有没有“chomp”,它都不适合我;它永远不会匹配。

123所示,即使chomp也存在另一个错误:如果匹配的字符串是文件中的最后一行,那么在找到匹配项时,文件已被读取,因此eof返回true,并且您收到一条声明未找到该字符串的语句。你可以通过使用一个标志来修复(例如你在那里),在这种情况下你不会再通过eof来决定。

这将是一件非常好的事情,因为你现在拥有的东西有点扭曲(而且相当脆弱!)逻辑 - 这正是这个最后一行错误的结果,当然。

答案 1 :(得分:2)

如果你不打算,你只需要更改匹配以包含一个新行。

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

答案 2 :(得分:0)

当您循环遍历文件的每一行时,Chomp会从行尾删除换行符。由于您将该行与没有换行的文本进行匹配,因此找不到匹配项,并且直到最后才读取该文件。因此检查End-Of-File的最后一个条件是真的,&#34; die&#34;声明已经执行。