Go to content Go to menu Go to search

Шпаргалка по хэшам

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!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved