リスト操作対応表
おもいつきでだらだら書いたので、足りていない可能性の方が高いです。
ちなみに Perl には Scala の List 見たいなものや、Stream みたいなものは標準では用意されていないため、通常は配列を使います。
@ で始まる変数が配列です。でも配列への参照も良く使うので、$で始まってても参照先が配列というのはよくあること。
操作名 | Scala | Perl |
---|---|---|
map | xs.map { _ + 1 } |
map { $_ + 1 } @xs |
flatMap | xs.flatMap { x => x*2-1::x*2::Nil } |
map { ($_ * 2 - 1, $_ * 2) } @xs |
filter | xs.filter { _ % 2 == 0 } |
grep { $_ % 2 == 0 } @xs |
reduce | xs.reduceLeft { _ + _ } |
List::Util::reduce { $a + $b } @xs |
fold | (1 /: xs){ _ * _ } |
List::Util::reduce { $a * $b } (1, @xs) |
zip | xs.zip(ys) |
List::MoreUtils::pairwise { [$a, $b] } @xs, @ys |
find | xs.find { _ % 2 == 0 } |
List::Util::first { $_ % 2 == 0 } @xs |
max | xs.max |
List::Util::max @xs |
Extractor | val y::ys = xs |
my ($y, @ys) = @xs |
とりあえずいま思いつくところだとこんな感じです。
Perl では配列内に配列をいれても展開されるので、flatten と同じ効果が欲しい場合はそのまま配列を、二次元配列にしたい場合は配列への参照を格納する必要があります。
なので、flatMap 相当の処理は map のブロックが返す値を配列にすれば実現できます。
また、zip 相当の処理は pairwise で配列への参照を返すようにしています。[$a, $b] の部分が $a と $b を要素にもつ配列への参照を表します。