mapと非破壊

あんまり元記事とカンケイなかったりするけど、一応。

print join "\n" , map { s/a/A/g; $_ } @list;

この書き方は@listを破壊してしまう。

無論、破壊されても構わない場合はこれでもいいが、mapを使っているということは基本的には破壊されたくないはずだ。(でしょでしょ?)

破壊させる目的ならば個人的にはforeachを使う方がいいと思ってる。

s/a/A/g foreach @list;
print join "\n" , @list;

ま、それでもmapを使って値を変更しつつ@listを破壊したくないのであれば

print join "\n" , map { my $t = $_; $t =~ s/a/A/g; $t } @list;

と書けばいいだろう。

また、my宣言使うのは良いけどもう少し短く書けないの?と疑問を持つ人は

print join "\n" , map { (my $t = $_) =~ s/a/A/g; $t } @list;

と書けばいいだろう。

また、@listを破壊されたくは無いけどmy宣言は面倒なんで、$_をそのまま使いたいというわがままな人は

print join "\n" , map { local $_ = $_; s/a/A/g; $_ } @list;

と書けばいいだろう。

また、map内でmyだのlocalだの宣言することに嫌気をさした人ならば

print join "\n" , map { s/a/A/g; $_ } my @temp = @list;

と書けばいいだろう。

また、@tempなんて一時変数使いたくない人であれば

print join "\n" , map { s/a/A/g; $_ } @{[@list]};

と書けばいいだろう。

また、$_を破壊するのが自明なのにmapの最後に$_をいちいち指定するのがクソ面倒な人ならば

use List::MoreUtils qw/apply/;

print join "\n" , apply { s/a/A/g } @list;

と書けばいいだろう。

また、俺は何でもいいから流行に乗りたいんだよ!という人ならばもはやコレしかない

use autobox;
use autobox::Core;
use List::MoreUtils;
package ARRAY;
sub apply (\@;&) {
    my $arr = CORE::shift;
    my $sub = CORE::shift;
    [ List::MoreUtils::apply { $sub->($_) } @$arr ];
}
package main;

(\@list)->apply(sub { s/a/A/g })->join("\n")->print;


と、言うことでautoboxでパッケージは破壊して@listを破壊しないように守ってあげましょう。