我有以下数据结构
my %HoH = {
'foo1' => {
'bam' => 1,
'zip' => 0,
},
'foo2' => {
'bam' => 0,
'zip' => 1,
'boo' => 1
}
};
我想按存储在'zip'中的VALUE按从最大到最小的顺序对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
。
答案 0 :(得分:6)
%HoH
被声明为哈希,但被定义为哈希引用。使用括号(...)
代替大括号{...}
。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']
];