Основная проблема заключается в наличии подпрограммы, которая имеет доступ к хешу. Вы должны либо создать одну функцию для каждого хэша, который хотите отсортировать:
#!/usr/bin/perl
use strict;
use warnings;
{
my %hash = (
a => 1,
b => 2,
c => 3,
);
sub sort_hash_a {
return $hash{$a} <=> $hash{$b};
}
for my $k (sort sort_hash_a keys %hash) {
print "$k\n";
}
}
{
my %hash = (
x => 1,
y => 2,
z => 3,
);
sub sort_hash_b {
return $hash{$a} <=> $hash{$b};
}
for my $k (sort sort_hash_b keys %hash) {
print "$k\n";
}
}
Или создайте функцию более высокого порядка, которая создаст функции для вас:
#!/usr/bin/perl
use strict;
use warnings;
sub make_hash_sort {
my $hashref = shift;
return sub {
return $hashref->{$a} <=> $hashref->{$b};
};
}
my %hash = (
one => 1,
two => 2,
three => 3,
);
my $sub = make_hash_sort \%hash;
for my $k (sort $sub keys %hash) {
print "$k\n";
}
Но все это, как правило, напрасная трата и для программиста, и для компьютера. Синтаксис блока быстрее и проще в использовании почти во всех случаях. Единственными исключениями могут быть сложные сортировки или повторяющийся код.