講義の後、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