[英]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
已经被解释Kallol和Sobrique :新行保持在$_
其中因此不匹配(而不换行字符串),因此该文件被读取到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.