我在 Perl 中发现了一个奇怪的 chomp 行为,我无法理解为什么 chomp 会这样工作。
以下行没有按预期工作
if ( chomp($str1) eq chomp($str2) )
但是,以下工作正常
chomp $str1;
chomp $str2;
if ( $str1 eq $str2 )
您能否对这种 chomp 行为提供一些见解?
chomp
修改它的论点。它不返回修改后的参数。事实上,第二个例子是你应该如何使用它。
编辑:perldoc -f chomp
说:
chomp This safer version of "chop" removes any trailing string that
corresponds to the current value of $/ (also known as
$INPUT_RECORD_SEPARATOR in the "English" module). It returns
the total number of characters removed from all its arguments.
chomp
返回删除的字符数,而不是已被压缩的字符串。
我喜欢 chomp() 这个名字,它的声音告诉你它做了什么。正如@ruakh 提到的,它需要一个或多个参数,所以你可以说:
chomp($str1,$str2);
if ( $str1 eq $str2 ) ...
你也可以给它一个字符串数组,就像一次读取整个文件一样,例如:
chomp(@lines);
通常,您可以将s,$/$,,r
正则表达式用作非破坏性的 chomp。$/
它从结尾$_
或使用提供的字符串中删除记录分隔符=~
,并在不修改任何内容的情况下返回结果。您的示例如下所示:
if ( $str1 =~ s,$/$,,r eq $str2 =~ s,$/$,,r )
更正式地说,正则表达式应该是s,\Q$/\E$,,r
,因此$/
不被视为正则表达式。在段落模式下,正则表达式需要是s,\n*$,,r
. 在 slurp 或固定记录模式下,根本不需要正则表达式(chomp 什么都不做)。