Perlでの繰り返し処理
Koboldエンジンスクリプトを改良していたときに思ったのだけれど、Perlで配列に対して繰り返し処理を行うときに、forとかforeachを使う人って、多いのではないだろうか?
処理が長いときはforやforeach(*1)でよいのだが、簡単な操作なら、join, map, grepという関数を使う方がよりPerlらしいスクリプトになる。たとえば、
my $indent = " "; # 半角スペース4つ foreach (@myarray) { print $indent.$_."\n"; }
みたいに書くなら、
my $indent = " "; # 半角スペース4つ print join "\n", map { $indent.$_ } @myarray;
と書くほうが、Perlらしいということです。
*1 ところで、この2つ(forとforeach)は全く同じ動作だということも、知られているようで、意外と知られていなかったりするようだ。つまり、
my $indent = " "; # 半角スペース4つ for (@myarray) { print $indent.$_."\n"; }
とか、
my $indent = " "; # 半角スペース4つ foreach ($i = 0; $i <= $#myarray; $i++) { print $indent.$myarray[i]."\n"; }
とか、書けるということ。
*2 あと、一行ifの構文も意外と知られていない?
if ($myvar eq "foo") { print $myvar."\n" }
の代わりに、
print $myvar."\n" if ($myvar eq "foo");
と書けること。{,}で囲まなければ、if節は行の後ろに来るのがPerl流。