【问题标题】:Use of chomp in this Perl script在这个 Perl 脚本中使用 chomp
【发布时间】:2016-05-28 21:03:03
【问题描述】:

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

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 的情况下无法运行,并且有人指出了我正确的方向。

【问题讨论】:

  • 我不是反对者,但这是一个非常普遍的问题;你在发帖前找过重复的吗?
  • 不相关,但这段代码写得很糟糕,因为如果它在最后一行,它会说找不到 Team 42...
  • @tripleee 我做到了!关于 chomp 和 Perl 有很多问题,第一批对我没有帮助。或者至少我从这些问题中不明白发生了什么,因为它们与我的问题不同。
  • chomp documentation 在我看来是一个详尽的答案。特别是; “当您担心最终记录可能缺少换行符时,它通常用于从输入记录末尾删除换行符。”
  • @tripleee 我明白这一点,但我不明白为什么必须匹配,因为我们已经遍历了所有行 - 为什么需要删除新行?只有在阅读了 Kallol 的帖子后,我才意识到 eq 如果不被 chomped 会失败,因为循环的 actual 字符串是 Team 42\n。所以这就是我的问题与其他 chomp 问题不同的原因:我不知道为什么我的代码在没有 chomp 的情况下无法正常工作,并且有人指出了我正确的方向。

标签: perl chomp


【解决方案1】:

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

KallolSobrique 解释了为什么没有 chomp 的代码无法执行您想要的操作:$_ 中保留了一个换行符,因此不匹配(没有新行),所以文件被读到最后,eof 返回真。看 chomp(或perldoc -f chomp)。正如你所说,我没有看到脚本“抛出错误”。它不适合我,不管有没有“chomp”;它只是永远不匹配。

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

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

【讨论】:

  • 但是为什么代码不吃东西就不能工作呢?
  • 因为$_末尾包含换行符,所以eq测试失败。
  • 在这些答案中,这个得到了我的支持。不过,推迟到其他关于为什么代码不起作用的答案在这里有点麻烦。一个好的答案应该独立存在,并彻底解决OP的问题。
  • 我们所有人偶尔都会无缘无故地被否决。继续前进,您应该最终以稳定的速度从您的答案中获得代表。几年前我刚开始在这里发布的内容时,我仍然会获得支持。
  • @BramVanroy 感谢您的评论,跟随行动,非常支持。正如你可以想象的那样,这个问答对我来说是一种内在的体验,看看它是如何发挥作用的,这很有教育意义。非常感谢 Tripleee 的回复和他的 cmets。 (我会在几天内删除它。)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多