Шпаргалка по хэшам
Read This: Хэши (ассоциативные массивы) в Perl на OpenNet
Вывести хэш с сортировкой по ключам
my %hash=('for'=>1000,'to'=>1500,'in'=>2000,'do'=>500); foreach $key(sort keys %hash){ print "$key => $hash{$key}\n"; #отсортирует в алфавитном порядке по значениям ключа }
Вывести пары ключ - содержимое, с сортировкой по содержимому (по возрастанию. для сортировки по убыванию следует поменять местами $a и $b: foreach(sort {$hash{$b} <=> $hash{$a}} keys %hash) {
)
my %hash=('for'=>1000,'to'=>1500,'in'=>2000,'do'=>500); foreach(sort {$hash{$a} <=> $hash{$b}} keys %hash) { print $_,'=',$hash{$_},"\n"; }
То же самое с сортировкой содержимого по алвафиту
foreach $key(sort {$hash{$a} cmp $hash{$b}} keys %hash){ print $key, " => ", $hash{$key},"\n"; }
Процедуры для сортировки одномерного хэша
В примерах выше показано как отсортировать хэш и сразу произвести над ним действия. Когда нужно произвести такие действия над несколькими хэшами в разных местах программы, эффективно выделить сортировку в отдельную процедуру.
На вход процедура принимает ссылку на хэш, на выходе выдает ссылки на два массива, в одном ключи, в другом значения.
Сортировка по значениям:
sub sort_hash_by_values { my ($hash) = @_; my $i=0; my @keys; my @values; foreach my $key(sort {$hash->{$b} <=> $hash->{$a}} keys %$hash) { #print $key,'=',$hash->{$key},"\n"; $keys[$i]=$key; $values[$i]=$hash->{$key}; $i++; } return \@keys, \@values; }
Сортировка по ключам:
sub sort_hash_by_key { my ($hash) = @_; my $i=0; my @keys; my @values; foreach my $key(sort keys %{$hash}){ #print "$key => ",$hash->{$key},"\n"; #отсортирует в алфавитном порядке по значениям ключа $keys[$i]=$key; $values[$i]=$hash->{$key}; $i++; } #print %sorted_hash; return \@keys, \@values; }
вызов процедур:
my %hash=('for'=>1000,'to'=>1500,'in'=>2000,'do'=>500); my ($sorted_keys,$sorted_values) = &sort_hash_by_values(\%hash); my $i = 0; foreach ( @{$sorted_keys} ) { print "$sorted_keys->[$i] => $sorted_values->[$i] \n"; $i++; }
результат:
in => 2000 to => 1500 for => 1000 do => 500
Enjoy!