Perl 5.14 かららしいのだけど、置換(s/old/new/)に非破壊的動作をさせる r フラグが加わったことを今更知って浮かれている。
なんで浮かれてるかと言うと、map の書き方が凄くスッキリするから。
例えば r フラグがなかった頃はこう書いていた。
my @vals = qw( foo bar baz ); my @new_vals = map { s/^/value_is_/; $_ } @vals; print "$_\n" for @new_vals; # value_is_foo # value_is_bar # value_is_baz
そう、そして残念なことに、
print "$_\n" for @vals; # value_is_foo # value_is_bar # value_is_baz
と、問答無用で元の変数も上書きされてしまう。
つまりこれを防ぐためにはこう書かなくてはならなかった。
my @vals = qw( foo bar baz ); my @new_vals = map { my $tmp = $_; $tmp =~ s/^/value_is_/; $tmp } @vals; # こうしてやっと・・・ print "$_\n" for @new_vals; # value_is_foo # value_is_bar # value_is_baz print "$_\n" for @vals; # foo # bar # baz
これがですね、非破壊的 r フラグを使うとこんなにスッキリ!
my @new_vals = map { s/^/value_is_/r } @vals; print "$_\n" for @new_vals; # value_is_foo # value_is_bar # value_is_baz print "$_\n" for @vals; # foo # bar # baz
やったね!