Reputation: 5772
I found a strange behavior of chomp in Perl and I am unable to comprehend why is chomp is working like this.
The following line does not work as expected
if ( chomp($str1) eq chomp($str2) )
But, the following works fine
chomp $str1;
chomp $str2;
if ( $str1 eq $str2 )
Can you please give some insight in this behavior of chomp?
Upvotes: 3
Views: 3388
Reputation: 3905
Generally, you can use s,$/$,,r
regex as a non-destructive chomp. It removes record separator $/
from the end of $_
or the string provided using =~
, and returns the result without modifying anything. Your example would look like this:
if ( $str1 =~ s,$/$,,r eq $str2 =~ s,$/$,,r )
More formally the regex should be s,\Q$/\E$,,r
, so $/
is not treated as regex. In paragraph mode the regex would need to be s,\n*$,,r
. In slurp or fixed record mode the regex is not needed at all (chomp does nothing).
Upvotes: 0
Reputation: 561
I like the name chomp() it's sound tells you what it does. As @ruakh mentions it takes one or more arguments, so you can say:
chomp($str1,$str2);
if ( $str1 eq $str2 ) ...
You can also hand it an array of strings, like what you would get from reading a whole file at once, e.g.:
chomp(@lines);
Upvotes: 2
Reputation: 10582
chomp
returns the number of characters removed, not the strings that have been chomped.
Upvotes: 2
Reputation:
chomp
modifies its argument. It does not return a modified argument. The second example is, in fact, how you're supposed to use it.
edit: perldoc -f chomp
says:
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.
Upvotes: 12