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

一歩前進.