С perlfaq4 , ответ на "http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash" содержит большую часть информации, которая необходима вам для составления кода.
Возможно, вы захотите увидеть главу о сортировке в Изучение Perl .
У Криса совершенно хороший ответ, хотя я ненавижу использовать values
таким образом. Более привычный способ сделать то же самое - это просмотреть ключи хэша верхнего уровня, но отсортировать по ключу второго уровня:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
Я делаю это так, потому что это немного менее изнурительно.
Как отсортировать хеш (необязательно по значению вместо ключа)?
(предоставлено Брайаном Д. Фой)
Чтобы отсортировать хеш, начните с ключей. В этом примере мы даем список ключей для функции сортировки, которая затем сравнивает их ASCIIbetically (на что могут повлиять ваши настройки локали). Список вывода имеет ключи в ASCIIbetical порядке. После того, как у нас есть ключи, мы можем просмотреть их, чтобы создать отчет, в котором перечислены ключи в порядке ASCII.
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key ( @keys )
{
printf "%-20s %6d\n", $key, $hash{$key};
}
Мы могли бы получить больше фантазии в блоке sort (). Вместо того, чтобы сравнивать ключи, мы можем вычислить значение с ними и использовать это значение для сравнения.
Например, чтобы сделать наш порядок отчетов без учета регистра, мы используем последовательность \ L в строке в двойных кавычках, чтобы сделать все строчными. Затем блок sort () сравнивает значения в нижнем регистре, чтобы определить, в каком порядке следует помещать ключи.
my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
Примечание: если вычисления дорогие или хеш содержит много элементов, вы можете посмотреть на преобразование Шварца для кэширования результатов вычислений.
Если вместо этого мы хотим отсортировать по значению хеша, мы используем ключ хеша, чтобы найти его. Мы все еще получаем список ключей, но на этот раз они упорядочены по их значению.
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
Оттуда мы можем стать более сложными. Если значения хеша совпадают, мы можем предоставить вторичную сортировку для ключа хеша.
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;