hashを値の降順にソートして2次元配列にして返す


sub descend_hash {
my ($hash_ref) = @_;
my @tmp;
my @sorted;

foreach my $name (sort { $$hash_ref{$b} <=> $$hash_ref{$a} } keys %$hash_ref){
push @tmp, $name;
push @tmp, $$hash_ref{$name};
push @sorted, [@tmp];
@tmp = ();
}
return @sorted;
}


ハッシュのリファレンスを渡す。

デリファレンスをしてソートする。

ハッシュのキーと値を配列に格納する。

格納した配列を[]で囲み、無名配列として戻り値となる配列に格納するのがポイントである。

ここで配列のリファレンスである \@tmp を格納すると、

次の @tmp = (); で格納した配列がクリアされてしまう。

この辺は「プログラミングPerl」に書いてある。

というか、最初リファレンスで格納しようとしてうまくいかなかったので参照した。




使い方

my @array = util::descend_hash(\%myhash);
print '<table>';
foreach(@array){
print '<tr>';
foreach(@$_){
print '<td>';
print ;
print '</td>';
}
print '</tr>';
}
print '</table>';


@arrayに格納されているのは配列のリファレンスなので、

@$_ というふうにデリファレンスしてprintする。

各要素に直接アクセスするには $$_[0]というふうにする。