
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
やったね!
