От 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 (на которые могут влиять ваши настройки локали). Выходной список имеет ключи в ASCII-битезированном порядке. Когда у нас есть ключи, мы можем пройти через них, чтобы создать отчет, в котором перечислены ключи в 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;
Примечания: если вычисление дорого или хэш имеет много элементов, вы можете захотеть взглянуть на Шварц Transform для кэширования результатов вычислений.
Если мы хотим отсортировать по хеш-значению вместо этого, мы используем хеш-ключ, чтобы посмотреть его. Мы по-прежнему получаем список ключей, но на этот раз они упорядочены по их стоимости.
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
Оттуда мы можем усложниться. Если значения хэша одинаковы, мы можем предоставить вторичный вид хэш-ключа.
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
ли вы имеете в виду, что вы хотите получить список хэшей (как hash1), отсортированных по графу из значений в hash2? – Jagmal
yes Jagmal, что означает, что я хочу сортировать по отношению к $ hash2 {"asd"} {count}. – systemsfault