2012-01-08 4 views
2

В Perl'е, у меня есть хэш, который выглядит следующим образом:Сортировка хэш-ключи вложенной хэш

$hash{key1}->{a} = 1; 
    $hash{key1}->{b} = 3; 

    $hash{key2}->{a} = 4; 
    $hash{key2}->{b} = 7; 

    $hash{key3}->{a} = 2; 
    $hash{key3}->{b} = 5; 

Как я могу сортировать ключи этого хэш-значением ключа a. Например, сортировка вышеуказанного хэша в числовом порядке возрастания значениями a даст: key1, key3, key2.

+0

Убедившись в «правиле стрелки» ['perldoc perlreftut'] (http://perldoc.perl.org/perlreftut.html#Arrow-Rule), вам не нужен какой-либо из' -> 'в вашем примере , Это создает более чистые многоуровневые хеши. –

+1

@JoelBerger: Забавно, что вы думаете, что удаление -> делает выражение более читаемым. Я, как известно, представлял -> между компонентами сложного выражения только по той же причине: сделать его более читаемым. Думаю, читаемость в глазах смотрящего :) –

+0

@PrakashK, безусловно, глаз смотрящего. Обычно мое правило: никакие стрелки для чисто структур данных (особенно одного и того же типа, то есть HoH или AoA и т. Д.), Всегда стрелки для вызова/разыменования подпрограмм и все, что чище для чего-либо еще. –

ответ

4

Perl не имеет никакого понятия отсортированного хэш, вам придется «сортировать» ключи в цикле Еогеасп:

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

my %hash =(); 

$hash{key1}->{a} = 1; 
$hash{key1}->{b} = 3; 

$hash{key2}->{a} = 4; 
$hash{key2}->{b} = 7; 

$hash{key3}->{a} = 2; 
$hash{key3}->{b} = 5; 

print "$_\n" foreach sort {$hash{$a}->{a} <=> $hash{$b}->{a}} keys %hash; 

В качестве альтернативы, вы можете поместить результат sort в массиве и петли на этом массиве.

+0

Спасибо fge. Это сработало отлично. Я слегка манипулировал утверждением: 'foreach my $ key (sort {$ hash {$ a} -> {'a'} <=> $ hash {$ b} -> {'a'}} ключи% hash) {... } '. – user001

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