繁体   English   中英

在此Perl脚本中使用chomp

[英]Use of chomp in this Perl script

我试图在这里学习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删除新行。 因此,在每个循环中,我们在行尾都删除了新行,但是为什么呢? 如果删除该脚本,脚本确实会引发错误,但是我不明白为什么。

请重新考虑不赞成投票的方式 :我了解排字法的作用,但由于我们已经遍历所有行,我不明白为什么要进行排字法匹配-那么您为什么还要删除新行? 只是在阅读了Kallol的文章之后,我才意识到,如果不加限制,eq将会失败,因为循环的实际字符串就是Team 42 \\ n。 所以这就是为什么我的问题与其他chomp问题不同的原因:我不知道为什么我的代码无法与chomp一起使用,并且有人向我指出了正确的方向。

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

为什么代码没有你打算什么没有chomp已经被解释KallolSobrique :新行保持在$_其中因此不匹配(而不换行字符串),因此该文件被读取到end和eof返回true。 请参见chomp (或perldoc -f chomp )。 正如您所说,我看不到脚本“引发错误”。 不管有没有“ chomp”,这都不适合我; 它永远不会匹配。

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

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

如果您不紧迫,则只需更改匹配项以包含新行。

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

当您在文件的每一行中循环浏览时,Chomp将从行尾删除新的行字符。 由于您要使该行与没有换行符的文本匹配,因此找不到匹配项,并且将读取文件直到最后。 因此,检查文件结束的最后一个条件为true,并执行了“ die”语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM