来自perlfaq4,"http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash" 的答案包含您编写代码所需的大部分信息。
您可能还想查看Learning Perl 中的排序章节。
克里斯有一个完全好的答案,虽然我讨厌这样使用values。做同样事情的更熟悉的方法是遍历顶级哈希的键,但按二级键排序:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
我这样做是因为它不那么令人费解。
如何对散列进行排序(可选择按值而不是键)?
(由布赖恩·d·福伊提供)
要对哈希进行排序,请从键开始。在此示例中,我们将键列表提供给排序函数,然后按 ASCII 顺序比较它们(这可能会受到您的语言环境设置的影响)。输出列表具有按 ASCII 顺序排列的键。一旦我们有了密钥,我们就可以通过它们来创建一个报告,以 ASCII 顺序列出密钥。
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key ( @keys )
{
printf "%-20s %6d\n", $key, $hash{$key};
}
不过,我们可以在 sort() 块中获得更多花哨。我们可以用它们计算一个值并将该值用作比较,而不是比较键。
例如,为了使我们的报告顺序不区分大小写,我们在双引号字符串中使用 \L 序列将所有内容变为小写。然后 sort() 块比较小写的值以确定放置键的顺序。
my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
注意:如果计算量很大或哈希有很多元素,您可能需要查看 Schwartzian 变换来缓存计算结果。
如果我们想按哈希值排序,我们使用哈希键来查找它。我们仍然会得到一个键列表,但这次它们是按值排序的。
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
从那里我们可以变得更复杂。如果哈希值相同,我们可以对哈希键进行二次排序。
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;