ソートは複数の条件を指定することができます。
%dic=();
$dic{'a'} = 0;
$dic{'b'} = 1;
$dic{'c'} = 2;
$dic{'d'} = 0;
$dic{'e'} = 2;
$dic{'f'} = 3;
$dic{'g'} = 0;
# 複数条件でソート
@sorted_keys = sort {$dic{$b} <=> $dic{$a} or $b cmp $a} keys %dic;
foreach $key(@sorted_keys) {
print "$key:$dic{$key}\n";
}
上の例では、ハッシュの値の降順にソートし、値が同じ場合はハッシュのキーの降順でソートする例です。
結果は以下のようになります。
f:3
e:2
c:2
b:1
g:0
d:0
a:0
orの左側に第一条件を指定し、もし第一条件が同じ値だった場合、次の条件をorの右側に指定します。条件が2つより多い場合は、更にorを続けて3番めの条件、4番めの条件、・・・というように続けることができます。
あまり条件が長くなると1行に書くのが分かりづらくなるようであれば、以下のようにソート条件を関数化することもできます。
%dic=();
$dic{'a'} = 0;
$dic{'b'} = 1;
$dic{'c'} = 2;
$dic{'d'} = 0;
$dic{'e'} = 2;
$dic{'f'} = 3;
$dic{'g'} = 0;
# ソート条件を関数呼び出しで
@sorted_keys = sort sort_routine keys %dic;
foreach $key(@sorted_keys) {
print "$key:$dic{$key}\n";
}
sub sort_routine
{
$dic{$b} <=> $dic{$a}
or
$b cmp $a
or
# もっといろんな条件
}
0 件のコメント:
コメントを投稿