mapと非破壊
- http://d.hatena.ne.jp/kazukichop/20080124/1201146190
- Perl分かってない - Lism.in * blog - nekoya (id:studio-m)
あんまり元記事とカンケイなかったりするけど、一応。
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を破壊しないように守ってあげましょう。