mapについての基礎知識(Schwartz変換のために)
実はずーっとSchwartz変換について知ったかぶりしていた.mapを使えるようになったので,そろそろ解釈してやるかと眺めて違和感.
my @names = map $_->[0], sort { $b->[1] <=> $a->[1] } map [ $_, ask_monkey_about($_) ], @castaways;
あれ,mapって第一引数ブロックじゃなかったっけ??
やってることはなんとなく理解できる.map [ $_, ask_monkey_about($_)], @castaway;は, @castawaysの各要素について[その要素,ask_monkey_aboutの戻り値]という配列リファレンスを要素とする配列を返す.
自分でコードを打って動かしてみる.mapの後ろのの配列リファレンスを{}で囲ってみるとエラー.ん,なんか,いらなくね?そこで違和感に気がつきラクダ本.ありました.
map map BLOCK LIST map EXPR, LIST
そうでしたか!EXPRはスカラー式(単文)という意味.つまり単文に限りカンマを入れることでブロックを書かなくていーよー.という記法になっている.
だから,こういうこと
my @input = (1,2,3,4,5); # map EXPR, LISTの使い方 #my @list = map [$_, $_ * 2, $_ * 3], @input; # map BLOCK LISTの使い方.ちょっと冗長だけれど. my @list = map {[$_, $_ * 2, $_ * 3]} @input; # これだとエラー # my @list = map {[$_, $_ * 2, $_ * 3]}, @input; # 出力テスト foreach my $element (@list){ print "@$element" . "\n" } # 出力結果 % perl mapprac.pl 1 2 3 2 4 6 3 6 9 4 8 12 5 10 15
一歩前進.