Perl では、ハッシュのキーを数値順にソートしたいと考えています。
{
five => 5
ten => 10
one => 1
four => 4
}
2 つの配列を生成します。
(1,4,5,10) and (one, four, five, ten)
そして、数値が連続するように値の配列を正規化します。
(1,2,3,4)
どうすればいいですか?
まず、関連する値でキーを並べ替えます。次に、値を取得します (たとえば、ハッシュ スライスを使用して)。
my @keys = sort { $h{$a} <=> $h{$b} } keys(%h);
my @vals = @h{@keys};
または、ハッシュ参照がある場合。
my @keys = sort { $h->{$a} <=> $h->{$b} } keys(%$h);
my @vals = @{$h}{@keys};
ハッシュをソートするにはどうすればよいですか (オプションでキーではなく値で)?
ハッシュをソートするには、キーから始めます。この例では、キーのリストを sort 関数に渡して、ASCIIbetically に比較します (ロケール設定の影響を受ける可能性があります)。出力リストには、キーが ASCII 順で表示されます。キーを取得したら、それらを調べて、キーを ASCII 順でリストするレポートを作成できます。
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key ( @keys ) {
printf "%-20s %6d\n", $key, $hash{$key};
}
ただし、sort() ブロックでもっと派手にすることもできます。キーを比較する代わりに、キーを使用して値を計算し、その値を比較として使用できます。
たとえば、レポートの順序で大文字と小文字を区別しないようにするには、比較する前に lc を使用してキーを小文字にします。
my @keys = sort { lc $a cmp lc $b } keys %hash;
注: 計算が高価であるか、ハッシュに多くの要素がある場合は、シュワルツ変換を調べて計算結果をキャッシュすることをお勧めします。
代わりにハッシュ値で並べ替えたい場合は、ハッシュ キーを使用して検索します。引き続きキーのリストを取得しますが、今回は値の順に並べています。
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
そこから、さらに複雑にすることができます。ハッシュ値が同じ場合は、ハッシュ キーで 2 番目の並べ替えを行うことができます。
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
「ハッシュをソートする方法 (オプションでキーではなく値で) 」というタイトルの Perl FAQ エントリを参照してください。
perldoc -q
を使用して、マシンでローカルに FAQ を検索することもできperldoc -q sort
ます。これが、私があなたの回答を見つけた方法です。
my ( @nums, @words );
do { push @nums, shift @$_;
push @words, shift @$_;
}
foreach sort { $a->[0] <=> $b->[0] }
map { [ $h->{ $_ }, $_ ] } keys %$h
;