1

次のように設定している HoA があります (テスト例)。

#!/usr/bin/perl -w
use strict;

my @array1 = qw (1 1 1 4 5); # Note '1' appears several times
my @array2 = qw (a b c d e);
my @array3 = qw (8 6 7 9 10);
my @array4 = qw (f g h i j);


my %hash;   
push @{$hash{$array1[$_]}}, [ $array2[$_], $array3[$_], $array4[$_] ] for 0 .. $#array1;

for my $key (sort keys %hash) { 
    for my $array (@ { $hash{$key} } ) {
        my ($array2, $array3, $array4) = @$array;
        print "[$key] $array2\t$array3\t$array4\n";
    }
}

出力:

[1] a   8   f
[1] b   6   g
[1] c   7   h
[4] d   9   i
[5] e   10  j

私がやりたいことは、最初にキーでソートできるようにすることです(上記のように)が、キーが同じ場合は、ハッシュに含まれる別の配列でソートします-たとえば、の値で数値的にソートして@array3、目的の出力:

        *
[1] b   6   g
[1] c   7   h
[1] a   8   f
[4] d   9   i
[5] e   10  j
4

1 に答える 1

7

この行を置き換えます

for my $array (@ { $hash{$key} } ) {

for my $array ( sort { $a->[1] <=> $b->[1] } @{ $hash{$key} } ) {

のすべての arrayrefs に@{ $hash{$key} }は、インデックス 1 で並べ替えたい要素があります。この並べ替えブロックは、2 番目のフィールドによって数値の昇順でそれらを並べ替えます。

于 2013-08-27T09:32:18.080 に答える