Perl按降序按值对哈希值进行排序,然后按升序键入

时间:2017-11-05 05:34:44

标签: perl sorting

假设我有像

这样的哈希值
%hash = 
{
    husky => 2
    alaska => 2
    akita => 3
    brand =>1
}

如何通过降序值(数字)和升序键(字母表)对其进行排序?期望的结果应该是:

{
    akita =>3
    alaska =>2
    husky =>2
    brand=>1
}

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
        };