3

Perlでchompの奇妙な動作を見つけましたが、なぜchompがこのように機能しているのか理解できません。

次の行は期待どおりに機能しません

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

ただし、以下は正常に機能します

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

このchompの振る舞いについて洞察をお願いします。

4

4 に答える 4

12

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.
于 2012-02-14T02:32:17.253 に答える
2

chompチョップされた文字列ではなく、削除された文字数を返します。

于 2012-02-14T02:33:54.363 に答える
2

私はchomp()という名前が好きです。それは音がそれが何をするかを教えてくれます。@ruakhが言及しているように、1つ以上の引数が必要なので、次のように言うことができます。

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

また、ファイル全体を一度に読み取ることで得られるような文字列の配列を渡すこともできます。例:

chomp(@lines);
于 2012-02-14T02:47:27.703 に答える
0

s,$/$,,r通常、正規表現は非破壊的なチョップとして使用できます。$/の末尾$_またはを使用して提供された文字列からレコード区切り文字を削除し=~、何も変更せずに結果を返します。あなたの例は次のようになります:

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

より正式には、正規表現はである必要がs,\Q$/\E$,,rあるため、正規$/表現としては扱われません。段落モードでは、正規表現はである必要がありますs,\n*$,,r。スラップモードまたは固定レコードモードでは、正規表現はまったく必要ありません(chompは何もしません)。

于 2019-02-27T13:35:54.677 に答える