Perl:对多维散列进行排序

Perl:对多维散列进行排序,perl,sorting,hash,multidimensional-array,Perl,Sorting,Hash,Multidimensional Array,我目前正试图在多维散列中按值排序,我有点不知所措 我在一个层面上做了如下工作: 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} <=> $examp

我目前正试图在多维散列中按值排序,我有点不知所措

我在一个层面上做了如下工作:

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} );
}
然后,我尝试了以下操作,但使用了一个额外的键:

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} );
    }
}

有什么想法吗?

您的外循环以某种随机顺序在整数键上循环,它正在指示输出的顺序。内部循环正在排序,但每次只给出一个值

要对两个键的所有组合的所有值进行排序,需要一个循环,并对生成的组合列表进行排序:

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} );
}

(将反向替换为切换顺序
$a
$b

某些情况下可能有多个$intKey和多个$stringKey是。谢谢,完成了工作。我想我会研究一下map函数。对不起,我没有15个代表:(
{4} - { Four} => 20
{1} - {  One} => 10
{3} - {Three} => 0
{2} - {  Two} => 30
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