Perlでchompの奇妙な動作を見つけましたが、なぜchompがこのように機能しているのか理解できません。
次の行は期待どおりに機能しません
if ( chomp($str1) eq chomp($str2) )
ただし、以下は正常に機能します
chomp $str1;
chomp $str2;
if ( $str1 eq $str2 )
このchompの振る舞いについて洞察をお願いします。
chomp
その引数を変更します。変更された引数は返しません。2番目の例は、実際、どのように使用するかです。
編集: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が言及しているように、1つ以上の引数が必要なので、次のように言うことができます。
chomp($str1,$str2);
if ( $str1 eq $str2 ) ...
また、ファイル全体を一度に読み取ることで得られるような文字列の配列を渡すこともできます。例:
chomp(@lines);
s,$/$,,r
通常、正規表現は非破壊的なチョップとして使用できます。$/
の末尾$_
またはを使用して提供された文字列からレコード区切り文字を削除し=~
、何も変更せずに結果を返します。あなたの例は次のようになります:
if ( $str1 =~ s,$/$,,r eq $str2 =~ s,$/$,,r )
より正式には、正規表現はである必要がs,\Q$/\E$,,r
あるため、正規$/
表現としては扱われません。段落モードでは、正規表現はである必要がありますs,\n*$,,r
。スラップモードまたは固定レコードモードでは、正規表現はまったく必要ありません(chompは何もしません)。