chomp in perl没有按预期工作

时间:2012-02-14 02:30:45

标签: perl chomp

我在Perl中发现了一个奇怪的chomp行为,我无法理解chomp为什么会像这样工作。

以下行无法按预期工作

if ( chomp($str1) eq chomp($str2) )

但是,以下工作正常

chomp $str1;
chomp $str2;
if ( $str1 eq $str2 )

您能否对chomp的这种行为有所了解?

4 个答案:

答案 0 :(得分:12)

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.

答案 1 :(得分:2)

chomp返回删除的字符数,而不是已经被删除的字符串。

答案 2 :(得分:2)

我喜欢名字chomp()它的声音告诉你它的作用。正如@ruakh所提到的,它需要一个或多个参数,所以你可以说:

chomp($str1,$str2);
if ( $str1 eq $str2 ) ...

你也可以把它交给一个字符串数组,就像你一次读取整个文件所得到的那样,例如:

chomp(@lines);

答案 3 :(得分:0)

通常,您可以将s,$/$,,r正则表达式用作非破坏性的chomp。它从$/的末尾删除记录分隔符$_或使用=~提供的字符串,并返回结果而无需进行任何修改。您的示例如下所示:

if ( $str1 =~ s,$/$,,r eq $str2 =~ s,$/$,,r )

更正式地说,正则表达式应为s,\Q$/\E$,,r,因此$/不被视为正则表达式。在段落模式下,正则表达式必须为s,\n*$,,r。在slurp或固定记录模式下,根本不需要正则表达式(chomp不执行任何操作)。