Простой способ сортировки на основе значений в хэше в perl

#perl

#perl

Вопрос:

Обычно сортировку на основе ключей и последующую итерацию хэша можно выполнить следующим образом:

 for $k (sort (keys %h)) {
  print $k, $h{$k};
}
  

Но как выполнить сортировку на основе значений, а затем выполнить итерацию по хэшу? Я могу подумать о создании нового хэша путем замены пар ключ и значение. Но есть ли какой-нибудь более умный способ сделать это?

Большое спасибо.

Комментарии:

1. perldoc -q сортировка: как мне отсортировать хэш (необязательно по значению вместо ключа)?

Ответ №1:

Это сортирует хэш % возраста по значению вместо ключа

 @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
  

Это выполняет сортировку на основе значения.
Для получения более подробной информации обратитесь к Perl Doc:

http://perldoc.perl.org/functions/sort.html

Ответ №2:

Если вы хотите, чтобы средство сравнения сортировки было чем-то иным, чем cmp , вы можете указать блок кода или подпрограмму в качестве первого параметра sort . Смотрите документацию для получения более подробной информации.

 my %h = (
    aaaa => 'z',
    bbb  => 'x',
    c    => 'y',
);

# Sort on hash values.
for my $k (sort {$h{$a} cmp $h{$b}} keys %h) {
    print $k, "n";   # bbb c aaaa
}

# Sort using a named subroutine.
for my $k (sort by_length keys %h) {
    print $k, "n";   # c bbb aaaa
}

sub by_length {
    length($a) <=> length($b);
}
  

Ответ №3:

Как мне отсортировать хэш (необязательно по значению вместо ключа)?

Если вы собираетесь программировать на Perl, то вам действительно следует уделить время чтению FAQ.