从
perlfaq4中,关于
如何对哈希进行排序(可选择按值而不是键)的问题的答案包含了你组合代码所需的大部分信息。
你可能还想看一下
《学习Perl》中关于排序的章节。
Chris给出了一个完全正确的答案,尽管我不喜欢使用
values
。一个更常见的做法是遍历顶层哈希的键,但按照二级键进行排序:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
我这样做是因为这样稍微不那么费脑筋。
如何对哈希进行排序(可选择按值而非键排序)?
(由brian d foy贡献)
要对哈希进行排序,从键开始。在此示例中,我们将键的列表提供给sort函数,它会对它们进行ASCIIbetical比较(可能受到区域设置的影响)。输出列表按ASCIIbetical顺序排列键。一旦我们有了键,我们可以遍历它们以创建一个报告,该报告按ASCIIbetical顺序列出键。
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;