2013-08-27 2 views
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 

То, что я хочу do может сортировать по первому ключу (как указано выше), но в тех случаях, когда ключ один и тот же, сортировка по другому массиву, содержащемуся в хеше - например численно значениями в @array3, чтобы дать желаемый результат:

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

ответ

7

Заменить эту строку

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

по

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

Все arrayrefs в @{ $hash{$key} } есть элемент, который вы хотите сортировать на индекс 1. Этот сортировочный блок упорядочивает их в порядке возрастания по второму полю.

Смежные вопросы