| 
                      2007年 8月 8日 (水)
                     
                      cgi(perl)でのsort(ソート)記述の仕方by k1s 
                      しばらくすると忘れそうなのでperlでのsortする場合の記述をメモしておきます
 
頻繁に必要になりそうな形です 
 2次配列で特定の項目で並べ替える場合
 
@LIST = ('A,7,佐藤', 
         'B,6,佐々木', 
         'A,4,高橋', 
         'C,5,田中', 
         'B,2,川口', 
         'C,1,雨宮', 
         'A,3,吉田');
 
2番目の要素(数字)で昇順で並べ替え 
 @LIST = map {$_->[0]} sort {$a->[2] <=> $b->[2]}  map {[$_, split /,/]} @LIST;
 
3番目の要素(名前)で降順で並べ替え 
 @LIST = map {$_->[0]} sort {$b->[3] cmp $a->[3]}  map {[$_, split /,/]} @LIST;
 
1番目の要素で昇順で並べ替えし,さらに2番目の要素(数字)で降順で並べ替えを行う 
 @LIST = map {$_->[0]}  sort {$a->[1] cmp $b->[1] or $b->[2] <=> $a->[2]} map {[$_, split /,/]} @LIST;
 
以上の記述は Schwartzian Transform という方式だそおうです。 
一番最初のスクリプトはデータ要素2番目の数字で並べ替えをおこなっております。 
sort関数では配列の中全てを並べ変えしてしまうので要素ごとに分解し特定の要素のみを並べ替えします
 
@LIST = sort { 
  my ($class, $number, $name) = split(/,/, $a); 
  my ($class, $number, $name) = split(/,/, $b); 
  $number <=> $number; 
} @LIST;
 
上記の記述を効率的に行うのがSchwartzian Transformだそうです
                      
                      
                      
 
                     |