我想对一个实际上有一个哈希作为值的哈希进行排序.例如:
my %hash1=(
field1=>"",
field2=>"",
count=>0,
);
my %hash2;
$hash2{"asd"}={%hash1};
Run Code Online (Sandbox Code Playgroud)
我%hash2用不同的计数值插入了大量的哈希值%hash2.
如何%hash1根据计数值对其进行排序hash1?
有没有办法在没有手动实现快速排序的情况下执行此操作,例如使用Perl的sort函数?
Chr*_*ung 10
my @hash1s = sort {$a->{count} <=> $b->{count}} values %hash2;
Run Code Online (Sandbox Code Playgroud)
从perlfaq4开始,"http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash"的答案包含了将代码组合在一起所需的大部分信息.
您可能还希望看到有关在学习Perl中排序的章节.
克里斯有一个完全正确的答案,虽然我讨厌这样使用values.执行相同操作的更熟悉的方法是遍历顶级哈希的键,但按二级键排序:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
Run Code Online (Sandbox Code Playgroud)
我是这样做的,因为它不那么令人费解.
如何对哈希进行排序(可选择按值而不是键)?
(由brian d foy提供)
要对哈希进行排序,请从键开始.在这个例子中,我们给sort函数提供了一个键列表,然后以ASCII的方式比较它们(这可能会受到你的语言环境设置的影响).输出列表具有ASCIIbetical顺序的键.获得密钥后,我们可以通过它们创建一个报告,按ASCIIbetical顺序列出密钥.
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key ( @keys )
{
printf "%-20s %6d\n", $key, $hash{$key};
}
Run Code Online (Sandbox Code Playgroud)
我们可以在sort()块中获得更多的幻想.我们可以使用它们计算值并使用该值作为比较,而不是比较键.
例如,为了使我们的报表顺序不区分大小写,我们在双引号字符串中使用\ L序列使所有内容都小写.然后sort()块比较较低的值以确定放置键的顺序.
my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
Run Code Online (Sandbox Code Playgroud)
注意:如果计算很昂贵或者哈希有很多元素,您可能需要查看Schwartzian变换来缓存计算结果.
如果我们想要通过哈希值进行排序,我们使用哈希键来查找它.我们仍然会得到一个密钥列表,但这次它们按其值排序.
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
Run Code Online (Sandbox Code Playgroud)
从那里我们可以变得更复杂.如果哈希值相同,我们可以在哈希键上提供二级排序.
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
Run Code Online (Sandbox Code Playgroud)