使い方
Perl Best Practices ネタ。
ソートを行う際、同じ引数を与えた場合、結果が同じとなる関数を利用する場合・・・
my @numbers = ( 1 .. 100 ); my @sorted_numbers = sort { calc($a) <=> calc($b) } @numbers; sub calc [ # いろいろ時間の掛かる処理 }
sort ブロック内の calc は何度も呼ばれるので、下記のように値をキャッシングした方が良い。
my @numbers = ( 1 .. 100 ); my @sorted_numbers = map { $_->[0] } sort { $a->[1] <=> $b->[1] } sort { [$_, calc($a)] } @numbers; sub calc [ # いろいろ時間の掛かる処理 }
で、これは下記と等価である。
use Memoize; memoize( 'calc' ); my @numbers = ( 1 .. 100 ); my @sorted_numbers = sort { calc($a) <=> calc($b) } @numbers; sub calc [ # いろいろ時間の掛かる処理 }
Memoize は sort 以外にも再帰等で利用すると良い。