シュウォーツ変換

  • 投稿日:
  • by
  • カテゴリ:

Perl私的メモ。

ブレイクスキャン・プロのウェブサーバ側コードの見直しを行っている。コードは2年以上前のブレイクスキャンからほとんど変わっていない。

当時は use strict なんて知らないものだから、とにかく動いてリリースできるものに仕立てることで精一杯だった。

見直している最中に、セットアップ条件の順番にソートするコードは目に余るほどひどいような気がしてきた。こういうときの教科書であるEffective PerlとData Munging with Perl(Perlデータマンジング)を読み直してみたところ、シュウォーツ変換を使えばすっきりしたコートが書けそうなことが分かった。

@$bstbl = map { $hrec{$_} } map{ $_->[0] }
          sort{ $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] }
          map { [$_, $hsetup{$_}] } keys %hsetup;

%hsetupはSymbolをキーにしてセットアップ条件順位(数字)が入っていて、%hrecにはSymbolをキーにして表示用データのリファレンスを格納。

@$bstblには、セットアップ条件順位で降順にソート、順位が同じならSymbolで昇順にソートしたときのデータ配列を返す。これはブレイクスキャンのロングセットアップのときの順序だ。

いままで怪しい変数とソートルーチンを使っていて、use strict にしたら解決が難しそうな状況に見えたのだが、目から鱗で、あっさり1行で変換できてしまった。

Perlの能力は侮れない。(なんだか分からない人にはスマソ)