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
 

 
やったね!
 
 
 

§1743 · Posted By · 2月 10, 2015 · Development · Tags: , · [Print]