Rubyのinject関数の記事を見た
一般的には畳み込み(fold)と言うらしい。Perlでも標準にライブラリにreduceという関数がある(なんでreduceなんだ)。使い方を見ると
use List::Util $foo = reduce { $a < $b ? $a : $b } 1..10; # min $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz'; # minstr $foo = reduce { $a + $b } 1 .. 10; # sum $foo = reduce { $a . $b } @bar; # concat $foo = reduce {$a + $b} 0, (1, 2, 3);
最後のは3つの引数のうち第2引数で初期値を指定している。
基本的にスクリプト言語は関数があれば関数を使った方が早い。リストデータがメモリに載れば、この方法が早いだろうな。関数の記載の仕方をみると非常に柔軟性があるメモリに載らなくても
$foo = reduce {$a + $b} foreach (<FILE>);
みたいな記載はできるのか?あとでやってみる。ちょっとまて普段使っている
$foo += $_ foreach (<FILE>);
と同じか...。