使い方

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 以外にも再帰等で利用すると良い。