在Perl中,我想通过值,使用数字哈希的键排序:
{
five => 5
ten => 10
one => 1
four => 4
}
产生两个数组:
(1,4,5,10) and (one, four, five, ten)
然后我想正常化值阵列,使得数字顺序:
(1,2,3,4)
我该怎么做呢?
在Perl中,我想通过值,使用数字哈希的键排序:
{
five => 5
ten => 10
one => 1
four => 4
}
产生两个数组:
(1,4,5,10) and (one, four, five, ten)
然后我想正常化值阵列,使得数字顺序:
(1,2,3,4)
我该怎么做呢?
首先由相关值的键排序。 然后得到的值(例如,通过使用散片)。
my @keys = sort { $h{$a} <=> $h{$b} } keys(%h);
my @vals = @h{@keys};
或者,如果你有一个散列引用。
my @keys = sort { $h->{$a} <=> $h->{$b} } keys(%$h);
my @vals = @{$h}{@keys};
我怎么排序哈希(任选被值而不是键)?
要排序的哈希,开始键。 在这个例子中,我们给键排序功能的列表,然后ASCIIbetically比较它们(这可能是由您的区域设置的影响)。 输出列表在ASCIIbetical顺序按键。 一旦我们有钥匙,我们就可以通过他们去创造一个报告,其中列出ASCIIbetical顺序按键。
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key ( @keys ) {
printf "%-20s %6d\n", $key, $hash{$key};
}
我们可以得到在排序()块更看中的不过。 相反,比较关键的,我们可以计算他们的值并使用该值作为比较。
例如,为了使我们的报告顺序不区分大小写,我们使用LC比较之前为小写字母键:
my @keys = sort { lc $a cmp lc $b } keys %hash;
注意:如果计算是昂贵或哈希有很多元素,你可能想看看使用Schwartzian变换缓存的计算结果。
如果我们想通过哈希值,而不是进行排序,我们使用散列键来关注一下吧。 我们仍然走不出键的列表,但这次他们是由他们的价值排序。
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
从这里我们可以得到更加复杂。 如果散列值是相同的,我们可以提供哈希键辅助排序。
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
请参阅标题为Perl的常见问题条目“我如何(按价值计算,而不是关键可选)排序散列”
http://perldoc.perl.org/perlfaq4.html#How-do-I-sort-a-hash-%28optionally-by-value-instead-of-key%29?
您还可以使用perldoc -q
本地搜索你的机器上的常见问题,如perldoc -q sort
,这是我怎么找到你的答案。
my ( @nums, @words );
do { push @nums, shift @$_;
push @words, shift @$_;
}
foreach sort { $a->[0] <=> $b->[0] }
map { [ $h->{ $_ }, $_ ] } keys %$h
;