gpt4 book ai didi

perl - 如何通过多个键对 perl 哈希进行排序?

转载 作者:行者123 更新时间:2023-12-01 08:53:25 24 4
gpt4 key购买 nike

您好,我有一个如下形式的数据结构:

$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 按键对哈希进行排序,但是如何按多个值和键排序?

最佳答案

之前有人问过类似的问题,可以在这里找到: Sorting an Array of Hash by multiple keys Perl

基本上,Perl 有两个用于排序的运算符,<=>cmp它返回 -1、0 或 1,具体取决于左侧是小于、等于还是大于右侧。 <=>用于数值比较,cmp用于字符串比较。可以在此处找到有关其使用的更多详细信息:Equality Operators .

这些运算符可以与 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 的一个键hashref 在特定的排序迭代。使用这些键,我们可以访问哈希的特定值,例如$data->{$a}->{key2} .通过把 $a之前 $b它将导致排序按升序排列,并将 $b之前 $a将导致排序按降序排列。

关于perl - 如何通过多个键对 perl 哈希进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34832562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com