我需要使用 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";
}