这有效:
my %score = ( a => 1, b => 2);
@keys = sort {$score{$a} <=> $score{$b}} keys %score;
Run Code Online (Sandbox Code Playgroud)
但是如何将代码放入{..}专用子例程中?
sub by_num {
$score{$a} <=> $score{$b}
}
@keys = sort by_num keys %score;
Run Code Online (Sandbox Code Playgroud)
?
这里的主要问题是有一个可以访问哈希的子程序.您要么必须为要排序的每个哈希创建一个函数:
#!/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";
}
}
Run Code Online (Sandbox Code Playgroud)
或者创建一个为您创建函数的高阶函数:
#!/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";
}
Run Code Online (Sandbox Code Playgroud)
但所有这一切通常都是程序员和计算机的浪费.几乎在所有情况下,块语法都更快,更容易使用.唯一的例外是复杂的排序或高度重复的代码.