如何在perl中对hash进行排序

时间:2012-12-26 14:14:45

标签: perl hash

我需要使用perl对哈希进行排序。

我的哈希是:

2 nameA
5 nameB
4 nameC
2 nameD
3 nameE

结果应该是:

2 nameA
2 nameD
3 nameE
4 nameC
5 nameB

怎么做?

谢谢,

Miko

2 个答案:

答案 0 :(得分:2)

对键进行排序并将它们存储在一个数组中。数组将保留订单。我在这里使用数字排序,因为你的键是数字的。

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中。

答案 1 :(得分:0)

foreach (sort keys %hash) {
  print "$_ : $hash{$_} \n";
}