我需要使用perl对散列进行排序。如何在perl中对散列进行排序
我的哈希值是:
2 nameA
5 nameB
4 nameC
2 nameD
3 nameE
的结果应该是:
2 nameA
2 nameD
3 nameE
4 nameC
5 nameB
怎么做到的?
谢谢,
巫女
我需要使用perl对散列进行排序。如何在perl中对散列进行排序
我的哈希值是:
2 nameA
5 nameB
4 nameC
2 nameD
3 nameE
的结果应该是:
2 nameA
2 nameD
3 nameE
4 nameC
5 nameB
怎么做到的?
谢谢,
巫女
排序密钥,并将它们存储在数组中。数组将保存顺序。我在这里使用了数字排序,因为你的键是数字。
my @sorted_keys = sort { $a <=> $b } keys %hash;
现在你可以访问它们,你想:
print "$_ $hash{$_}\n" for @sorted_keys;
你不能,但是,存储排序结果在哈希,因为哈希是没有顺序的。你不能有一个哈希键2
出现两个不同的值。这是不可能的设计。
如果您例如在一个文件中有该数据,您可以执行Schwartzian transform。 (阅读从底部,上了意见,它才有意义):
open my $fh, "<", $filename or die $!;
my @sorted = map $_->[2], # Then map them back into the third
sort {
$a->[0] <=> $b->[0] || # Sort them numerically on first
$a->[1] cmp $b->[1] # ..or alphabetically on second col
} map [ split, $_ ], # Map them into a 3-element array ref
<$fh>; # Take all the lines in the file
排序内部链接的报表将生效两个值无法区分,例如“2”和“2”从<=>
运算符返回0。在这种情况下,排序将按字母顺序排列在第二列,我们将其存储在数组元素1中。
foreach (sort keys %hash) {
print "$_ : $hash{$_} \n";
}
随时有一点文字解释:-) –
散列不是固有排序的。这就是为什么他们是哈希而不是数组。你究竟想要完成什么?你只是想打印按键排序的散列的键值对? – 2012-12-26 14:17:27
另外,等一下....'2'作为一个键出现两次。 – 2012-12-26 14:20:54
正如@JackManey所说:一个哈希不能有两次相同的密钥,所以你放的例子绝对不是Perl哈希。你想做什么? – m0skit0