假设我有像
这样的哈希值%hash =
{
husky => 2
alaska => 2
akita => 3
brand =>1
}
如何通过降序值(数字)和升序键(字母表)对其进行排序?期望的结果应该是:
{
akita =>3
alaska =>2
husky =>2
brand=>1
}
答案 0 :(得分:1)
Perl中的哈希值未订购,也无法订购。这是因为 hash 算法会随机扩展密钥。哈希的定义如下:
my %hash = (
key1 => value1,
key2 => value2,
);
也就是说,它是使用值对key => value
列表定义的。如果需要订购商品的集合,则需要使用列表。它的定义如下:
my @list = ( 1, 2, 3 );
你可以像这样定义一个散列引用列表(更接近你想要的):
my @list = (
{ key1 => value1 },
{ key2 => value2 },
);
哈希引用是对哈希的引用,它由{
和}
定义。
所以解决你的问题,我们有:
use Data::Dumper;
my %hash = (
husky => 2,
alaska => 2,
akita => 3,
brand =>1,
);
my @list = map { { $_ => $hash{$_} } }
sort { $hash{$b} <=> $hash{$a} or $a cmp $b }
keys %hash;
print Dumper(@list);
keys %hash
将为您提供哈希中的键列表。 sort
将对列表中的元素进行排序。由于我们需要特殊排序,我们使用运算符<=>
提供排序位的 body 来比较字符串和cmp
来比较数字。如果左侧小于右侧,则每个返回-1
; 0
如果它们相同,1
如果左侧多于右侧。如果第一个是or
,则0
将进入第二个比较。
最后,map
会将键列表(有序)转换为哈希引用列表。
Dumper
是一个函数,用于创建任何Perl数据结构的可读文本表示。
最终输出是:
$VAR1 = {
'akita' => 3
};
$VAR2 = {
'alaska' => 2
};
$VAR3 = {
'husky' => 2
};
$VAR4 = {
'brand' => 1
};