我想我的想法是正确的,但是有一些语法/约定的东西我搞砸了,因为我收到错误"全局符号%timeHash需要明确的包名称"。
法典:
foreach $key (sort hashValueDescendingNum (keys(%timeHash))) {
print "t$keytt $timeHash{$key}n";
}
sub hashValueDescendingNum {
my $hash = shift;
$hash{$b} <=> $hash{$a};
}
内联
foreach my $key (sort { $timeHash{$b} <=> $timeHash{$a} } keys %timeHash) {
print "t$keytt $timeHash{$key}n";
}
以您尝试的方式使用自定义排序函数将无法正常工作,因为这样您的子将需要访问原始哈希。
foreach my $key (sort hashValueDescendingNum (keys(%timeHash))) {
print "t$keytt $timeHash{$key}n";
}
sub hashValueDescendingNum {
$timeHash{$b} <=> $timeHash{$a}; # Ew.
}
相反,您可以进一步抽象它:
foreach my $key (sortedHashKeysByValueDescending(%timeHash)) {
print "t$keytt $timeHash{$key}n";
}
sub sortedHashKeysByValueDescending {
my %hash = @_;
my @keys = sort { $hash{$b} <=> $hash{$a} } keys %hash;
return @keys;
}
代码效率不高,因为它传递 %hash,但引用会更好:
foreach my $key (sortedHashKeysByValueDescending(%timeHash)) {
print "t$keytt $timeHash{$key}n";
}
sub sortedHashKeysByValueDescending {
my $hash = shift;
return sort { $hash->{$b} <=> $hash->{$a} } keys %$hash;
}
use List::UtilsBy qw( rev_nsort_by );
foreach my $key ( rev_nsort_by { $timeHash{$_} } keys %timeHash ) {
...
}