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.
 

 
 
 

§1777 · Posted By · 2月 26, 2015 · Development · Tags: , · [Print]