
講義の後、Tokyo.pmメーリングリストで、歌代和正さんから、「Schwartzian Transformは実行効率は良くない」と指摘を受けました。複雑なデータ構造をいじくり回すため、処理にオーバーヘッドがあります。中間変数を必要としない点は良いですが、何がなんでも中間変数を使わないという方針も考えものです。ここでは、map、grepのようなlisp的プログラミングの例題として考えてください。上のスライド中「効率的に実行」の部分を「簡潔に記述」と読みかえていただくとよさそうです。
なお、より効率的なソートが必要な場合には、以下のようなプログラムが良いようです(perldoc -f sort参照)。この方法では、インデックスをソートし、配列スライスによって並べかえた配列を得ています。
@nums = @caps = ();
for (@old) {
push @nums, /=(\d+)/;
push @caps, uc($_);
}
@new = @old[ sort {
$nums[$b] <=> $nums[$a]
||
$caps[$a] cmp $caps[$b]
} 0..$#old
];
ソートに関しては、Tom Christiansenによるこんな情報もあります。Schwartzian Transformの解説も入っています。
Far More Than Everything You've Ever Wanted to Know About Sorting