Как я могу отсортировать ключи хеша естественно? - PullRequest
14 голосов
/ 20 декабря 2008

У меня есть Perl-хеш, ключи которого начинаются с или являются цифрами.

Если я использую,

foreach my $key (sort keys %hash) {
    print $hash{$key} . "\n";
}

список может выглядеть как

0
0001
1000
203
23

Вместо

0
0001
23
203
1000

Ответы [ 4 ]

39 голосов
/ 20 декабря 2008
foreach my $key (sort { $a <=> $b} keys %hash) {
    print $hash{$key} . "\n";
}

Операция сортировки принимает необязательное сравнение «подпрограмма» (либо в виде блока кода, как я это сделал здесь, либо в качестве имени подпрограммы). Я предоставил встроенное сравнение, которое обрабатывает ключи как числа, используя встроенный оператор сравнения чисел '<=>'.

18 голосов
/ 22 декабря 2008

Ответ Павла верен для чисел, но если вы хотите сделать шаг вперед и отсортировать смешанные слова и числа, как это сделал бы человек, то ни cmp, ни <=> не подойдут. Например ...

  9x
  14
  foo
  fooa
  foolio
  Foolio
  foo12
  foo12a
  Foo12a
  foo12z
  foo13a

Сортировка :: Естественно решает эту проблему, предоставляя процедуры nsort и ncmp.

1 голос
/ 22 июня 2016

Ваша первая проблема - это тело цикла (на которое, похоже, нет другого ответа).

foreach my $key ( sort keys %hash ) {
    print $hash{$key} . "\n";
}

Мы не знаем, что это за ключи %hash, мы просто знаем, что они передаются вам как $key в лексическом порядке внутри цикла. Затем вы используете ключи для доступа к содержимому хеша, распечатывая каждую запись.

Значения хэша не выводятся в отсортированном порядке, поскольку вы сортируете по клавишам .

Вместо того, чтобы выводить значения в отсортированном порядке, рассмотрите следующий цикл:

foreach my $value ( sort values(%hash) ) {
    printf( "%s\n", $value );
}

Этот цикл выводит значения в указанном порядке:

0
0001
1000
203
23

Чтобы отсортировать их численно, используйте

foreach my $value ( sort { $a <=> $b } values(%hash) ) {
    printf( "%s\n", $value );
}

Это производит

0
0001
23
203
1000

что вы и хотели.

См. руководство по Perl для функции sort для получения дополнительной информации и многих других примеров.

1 голос
/ 22 июня 2016
$key (sort { $a <=> $b} keys %hash) 

сделает свое дело

или

$key (sort { $b <=> $a} keys %hash)

по убыванию

или даже

$key (sort { $a <=> $b} values %hash)
$key (sort { $b <=> $a} values %hash)
...