我目前正在尝试按多维哈希中的值排序,而且我有点难过了。
我在一个级别上完成了以下操作:
my %exampleHash = ();
$exampleHash{1}{value} = 10;
$exampleHash{2}{value} = 30;
$exampleHash{3}{value} = 0;
$exampleHash{4}{value} = 20;
foreach my $key ( reverse sort {$exampleHash{$a}{value} <=> $exampleHash{$b}{value}} keys %exampleHash )
{
printf( "%s => %d\n", $key, $exampleHash{$key}{value} );
}
这将产生以下输出,按预期值对其进行排序:
2 => 30
4 => 20
1 => 10
3 => 0
然后我尝试了以下操作来做同样的事情,但是有一个额外的键:
my %exampleHashTwo = ();
$exampleHashTwo{1}{"One"}{value} = 10;
$exampleHashTwo{2}{"Two"}{value} = 30;
$exampleHashTwo{3}{"Three"}{value} = 0;
$exampleHashTwo{4}{"Four"}{value} = 20;
foreach my $intKey ( keys %exampleHashTwo )
{
foreach my $stringKey ( reverse sort {$exampleHashTwo{$intKey}{$a}{value} <=> $exampleHashTwo{$intKey}{$b}{value}} keys %{$exampleHashTwo{$intKey}} )
{
printf( "{%d} - {%5s} => %d\n", $intKey, $stringKey, $exampleHashTwo{$intKey}{$stringKey}{value} );
}
}
然而,这似乎按字母顺序对字符串键进行排序。所以我假设我在正确的路线上,但我可能错放了一些东西?
{4} - { Four} => 20
{1} - { One} => 10
{3} - {Three} => 0
{2} - { Two} => 30
有什么想法吗?
答案 0 :(得分:1)
你的外部循环以某种随机的顺序循环遍历整数键,它决定了输出的顺序。内循环正在排序,但每次只给出一个值。
要对两个键的所有组合的所有值进行排序,您需要一个循环并对生成的此类组合列表进行排序:
use strict;
use warnings;
my %exampleHashTwo = ();
$exampleHashTwo{1}{"One"}{value} = 10;
$exampleHashTwo{2}{"Two"}{value} = 20;
$exampleHashTwo{2}{"TwoB"}{value} = 5;
$exampleHashTwo{3}{"Three"}{value} = 0;
$exampleHashTwo{4}{"Two"}{value} = 15;
for my $keypair (
sort { $exampleHashTwo{$b->[0]}{$b->[1]}{value} <=> $exampleHashTwo{$a->[0]}{$a->[1]}{value} }
map { my $intKey=$_; map [$intKey, $_], keys %{$exampleHashTwo{$intKey}} } keys %exampleHashTwo
) {
printf( "{%d} - {%5s} => %d\n", $keypair->[0], $keypair->[1], $exampleHashTwo{$keypair->[0]}{$keypair->[1]}{value} );
}
输出:
{2} - { Two} => 20
{4} - { Two} => 15
{1} - { One} => 10
{2} - { TwoB} => 5
{3} - {Three} => 0
(替换为$a
和$b
的切换顺序。)