2013-04-22 3 views
2

У меня есть следующая структураСортировка хэша хэшей по значению

my %HoH = { 
     'foo1' => { 
         'bam' => 1, 
         'zip' => 0, 
         }, 
     'foo2' => { 
         'bam' => 0, 
         'zip' => 1, 
         'boo' => 1 
         } 
    }; 

данные, которые я хотел бы отсортировать ключом1 (foo1 или foo2) по значению, сохраненному в «молнии» в порядке величайшая наименее.

Вот как я это делаю.

use strict; use warnings; 
use Data::Dumper; 
my @sorted; 
foreach my $KEY1 (keys %HoH) { 
    # sort KEY1 by the value 'zip' maps to in descending order 
    @sorted = sort {$HoH{$KEY1}{'zip'}{$b} <=> 
     $HoH{$KEY1}{'zip'}{$a}} keys %HoH; 
} 

print Dumper(\@sorted); 

Я получаю странное предупреждение: Ссылка нашла, где даже размер список ожидается на test.pl линии 6. Также print Dumper(\@sorted); печатает

$VAR1 = [ 
     'HASH(0x1b542a8)' 
    ]; 

Когда следует печатать

$VAR1 = [ 
     ['foo2', 'foo1'] 
    ]; 

С foo2 имеет 1 zip и foo1 имеет 0 zip.

+4

Ключевым моментом терминологии: Вы не можете сортировать хэш. Хэши не имеют порядка. То, что вы можете сделать, это распечатать вещи, которые находятся в хеше в определенном порядке, но сам хэш не сортируется. Это отличается от массивов PHP, где они действуют как хеши, но также имеют порядок сортировки. –

ответ

6
  • %HoH объявлен как хэш, но определяется как hashreference. Используйте круглые скобки (...) вместо брекетов {...}.
  • Вам не нужно проходить через хеш, чтобы отсортировать его. Сортировка позаботится об этом.
  • если вы sort {...} keys %HoH, то специальные переменные $a и $b представляют собой ключи от %HoH, поскольку он выполняет сортировку.
  • $a и $b находятся в обратном порядке, потому что ожидаемый результат в убывающем порядке. (Обновление: О, я только заметил, что у вас это было в первую очередь.)
  • Значение zip в вложенном хеше $HoH{$KEY}{'zip'}, что и должно сортироваться.

    use strict; 
    use warnings; 
    use Data::Dumper; 
    
    my %HoH = (
         'foo1' => { 
             'bam' => 1, 
             'zip' => 0, 
             }, 
         'foo2' => { 
             'bam' => 0, 
             'zip' => 1, 
             'boo' => 1 
             } 
        ); 
    
    my @sorted = sort {$HoH{$b}{'zip'} <=> $HoH{$a}{'zip'}} keys %HoH; 
    print Dumper \@sorted; 
    

Обратите внимание, что результат этого кода даст вам массив:

$VAR1 = [ 
     'foo2', 
     'foo1' 
]; 

... не вложенную массив:

$VAR1 = [ 
    ['foo2', 'foo1'] 
]; 
Смежные вопросы