我有一个数组的哈希值,看起来像这样:
{ $key, [$val1, $val2] }
我想通过数组的第二个值进行数字排序,并打印整个哈希表。我看过 Schwartzian 转换的帖子,但没有看到完全符合我要求的。我也对语法和如何将排序后的值映射回原始
{$key, [$val1, $val2] }
格式感到非常困惑。希望能得到帮助!我不太确定你指的是什么,但这是如何在哈希内实现对数组值进行排序的方法:
my %hash = ( 'key1' => [ 1, 2 ], 'key2' => [ 2, 3 ] );
for my $key ( sort { $hash{$a}[1] <=> $hash{$b}[1] } keys %hash ) {
print "$key => '", join(", ", @{$hash{$key}}), "'\n";
}
如果你确实想使用Schwartzian-Transform,以下是一种方法:
#!/usr/bin/perl
use Data::Dump qw(dump);
my %hash = (k1 => [1, 2], k2 => [24, 5], k3 => [5, 1]);
foreach(
sort { $a->[1] <=> $b->[1] }
map { [$_, $hash{$_}->[1] ] } keys %hash) {
say $_->[0],' => ',dump$hash{$_->[0]};
}
输出:
k3 => [5, 1]
k1 => [1, 2]
k2 => [24, 5]
NB:
我只是举例说明了Schwartzian Transform的用法。但正如评论中所说,在问题中解释的情况下并不需要使用它,ST在每个数组元素排序前都需要计算一些内容,因此可以节省成本。对于提出的问题,没有要计算的内容,所以不要在这里使用ST。
$hash{$_}->[1]
不是一个昂贵的操作。 - TLP
$hash->{$key}[1]
。您不需要Schwartzian转换。 - Axeman