Perlのmapは非破壊で使いたいものらしい

元々は、

print join("-", map { s/a/A/g } @list), "\n";

みたいにして@listの各要素を置換した配列のprintを1行で書けないのかなとか思って書いたんですが… Perl界隈の人達が反応してくれるという全く予想外の事態に。

根本的にはmapが何を返すのかを分かってないわけで。上記の書き方だと1-3-1が返ってくる。{}の処理を経た@listが入ると思ってたけど、{}の処理結果を無名配列に入れて、そのリファレンスが返ってくるってことなのかな。ちゃんと基本的な文法を勉強せんといかん。

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

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

そもそもmapとか何ぞやというのが全く理解出来てないんですが、トラバ頂いたエントリやはてブコメントを見ていると、そういうものらしい。

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

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

そうか、Perlってforeachも後置で書けるのか。そう言われてみればどこかで読んだような気もしてきた。これは便利。