如何按多个键对perl哈希进行排序?

4

你好,我有一个数据结构,其形式如下:

$data = {                                                                                           
    'a' => { key1 => 2, key2 => 1 },                                                                   
    'b' => { key1 => 1, key2 => 2 },                                                                   
    'c' => { key1 => 1, key2 => 1 },                                                                   
    'd' => { key1 => 3, key2 => 2 },                                                                   
    'e' => { key1 => 3, key2 => 1 },                                                                   
    'f' => { key1 => 1, key2 => 2 },                                                                   
};

我希望能够按照key2升序、key1降序和哈希键的升序遍历此数据结构,例如:
e
a
c
d
b
f

我该如何在Perl中实现这个功能?我知道可以使用sort keys %$data按键对哈希进行排序,但如何按多个值和键进行排序呢?
1个回答

11

类似的问题已经有人问过,可以在这里找到:按 Perl 中多个键排序哈希数组

基本上,Perl 有两个排序运算符,<=>cmp,它们返回 -1、0 或 1,取决于左边比右边小、相等还是大。<=> 用于数字比较,cmp 用于字符串比较。有关其使用的更多详细信息,请参见此处:等式运算符

这些运算符可与 Perl 的 sort 函数一起使用,并与 or 运算符结合使用,以实现您想要的结果:

#!/usr/bin/perl

use strict;
use warnings;

my $data = {
    'a' => { key1 => 2, key2 => 1 },
    'b' => { key1 => 1, key2 => 2 },
    'c' => { key1 => 1, key2 => 1 },
    'd' => { key1 => 3, key2 => 2 },
    'e' => { key1 => 3, key2 => 1 },
    'f' => { key1 => 1, key2 => 2 },
};

my @sorted = sort {
        $data->{$a}->{key2} <=> $data->{$b}->{key2} or
        $data->{$b}->{key1} <=> $data->{$a}->{key1} or
        $a cmp $b
    } keys %{$data};

for my $key (@sorted){
    print "$key\n";
}

由于 <=>cmp 对于相等情况返回0(false),这意味着我们可以使用 or|| 将多个相等性检查链接在一起。

在上面的例子中,我们使用 $a$b 来引用排序的特定迭代中 $data 散列引用的键。通过这些键,我们可以访问散列的特定值,例如$data->{$a}->{key2}。将 $a 放在 $b 之前将导致升序排序,将 $b 放在 $a 之前将导致降序排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接