我有以下数据结构
my %HoH = {
'foo1' => {
'bam' => 1,
'zip' => 0,
},
'foo2' => {
'bam' => 0,
'zip' => 1,
'boo' => 1
}
};
我想按照“zip”中存储的值从大到小对 KEY1(foo1 或 foo2)进行排序。
这就是我的做法。
use strict; use warnings;
use Data::Dumper;
my @sorted;
foreach my $KEY1 (keys %HoH) {
# sort KEY1 by the value 'zip' maps to in descending order
@sorted = sort {$HoH{$KEY1}{'zip'}{$b} <=>
$HoH{$KEY1}{'zip'}{$a}} keys %HoH;
}
print Dumper(\@sorted);
我收到一个奇怪的警告:引用发现 test.pl 第 6 行需要偶数大小的列表。
另外 print Dumper(\@sorted);
正在打印
$VAR1 = [
'HASH(0x1b542a8)'
];
何时应该打印
$VAR1 = [
['foo2', 'foo1']
];
因为 foo2
有 1 个 zip
而 foo1
有 0 zip
。
最佳答案
-
%HoH
被声明为哈希,但被定义为哈希引用。使用括号(...)
而不是大括号{...}
. - 您不需要循环遍历哈希来对其进行排序。 Sort 会处理这个问题。
- 如果你
sort {...} keys %HoH
,然后是特殊变量$a
和$b
代表%HoH
的键因为它执行排序。 -
$a
和$b
是相反的顺序,因为您的预期结果是按降序排列的。 (更新:哦,我刚刚注意到你一开始就有这个。) zip
嵌套哈希中的值为$HoH{$KEY}{'zip'}
,这就是您应该排序的依据。use strict; use warnings; use Data::Dumper; my %HoH = ( 'foo1' => { 'bam' => 1, 'zip' => 0, }, 'foo2' => { 'bam' => 0, 'zip' => 1, 'boo' => 1 } ); my @sorted = sort {$HoH{$b}{'zip'} <=> $HoH{$a}{'zip'}} keys %HoH; print Dumper \@sorted;
请注意,此代码的结果将为您提供一个数组:
$VAR1 = [
'foo2',
'foo1'
];
...不是嵌套数组:
$VAR1 = [
['foo2', 'foo1']
];
关于arrays - 按值对哈希值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16138652/