Hatena::Groupperl

Press::Alt_R

2010-07-12

Perlわかば (複数キーのsort)

#!perl

use strict;

my @records = (
{name=>"John" , age=> 10},
{name=>"Jack" , age=> 13},
{name=>"Mary" , age=> 10},
{name=>"Ken" , age=> 12},
{name=>"Bill" , age=> 10},
{name=>"Amy" , age=> 12},
);

my @sorted = sort{
   $a->{age} <=> $b->{age} or $a->{name} cmp $b->{name} 
} @records;

for(@sorted){
  print $_->{age}." ".$_->{name} , "\n";
}

メモ

  • 「A or B」= 「Aを評価」「Aが偽ならorの先へ」「Bを評価」
  • orは 1/0 ではなく、真の場合は評価値をそのまま返す
  • ( (A1 cmp B1) or (A2 cmp B2) ) の値は、全体としては、(1,0,-1) となる通常のcmpと同じ

todo

  • コストの高いソート
  • Schwarzian Transform