Perl の正規表現に非破壊フラグ r が導入される前、ある文字列を置換して別の変数に代入したい時にはこのように書いていた。
my $old = "it's old."; (my $new = $old) =~ s/old/new/;
正規表現演算子 (=~) は代入演算子 (=) よりも結合の優先順位が高い。
つまり下記のように書いてしまうと、 $old
に対しての置換が先に実行され文字列が破壊されてしまう。
# 意図したコードではない my $new = $old =~ s/old/new/;
更に言うと、 s/// はスカラーコンテキストでは置換した「回数」を数値で返すので $new
には $old
を置換した文字列ではなく「1」という数字が入ってしまう。
非破壊フラグ r は $old
を置換した文字列で上書きする代わりに「置換後の文字列」を返す(まるで正規表現に関数のような動作をさせる)フラグである。
だから以下のような書き方で、
$old
は破壊されることなく$new
には置換後の文字列が代入される
my $new = $old =~ s/old/new/r; print join "\n", ($old, $new); # it's old. # it's new.