Perl按哈希值排序哈希
问题描述:
我认为我有正确的想法,但有一些语法/约定的事情搞乱了,因为我得到错误“全局符号%timeHash需要显式包名”。Perl按哈希值排序哈希
代码:
foreach $key (sort hashValueDescendingNum (keys(%timeHash))) {
print "\t$key\t\t $timeHash{$key}\n";
}
sub hashValueDescendingNum {
my $hash = shift;
$hash{$b} <=> $hash{$a};
}
答
在线
foreach my $key (sort { $timeHash{$b} <=> $timeHash{$a} } keys %timeHash) {
print "\t$key\t\t $timeHash{$key}\n";
}
使用自定义排序功能,您试图将无法正常工作的方式,因为如果你的个子需要访问原始的哈希值。
foreach my $key (sort hashValueDescendingNum (keys(%timeHash))) {
print "\t$key\t\t $timeHash{$key}\n";
}
sub hashValueDescendingNum {
$timeHash{$b} <=> $timeHash{$a}; # Ew.
}
相反,你可以抽象进一步:
foreach my $key (sortedHashKeysByValueDescending(%timeHash)) {
print "\t$key\t\t $timeHash{$key}\n";
}
sub sortedHashKeysByValueDescending {
my %hash = @_;
my @keys = sort { $hash{$b} <=> $hash{$a} } keys %hash;
return @keys;
}
的代码是不是有效,因为它传递%哈希围绕不过,引用会更好:
foreach my $key (sortedHashKeysByValueDescending(\%timeHash)) {
print "\t$key\t\t $timeHash{$key}\n";
}
sub sortedHashKeysByValueDescending {
my $hash = shift;
return sort { $hash->{$b} <=> $hash->{$a} } keys %$hash;
}
+0
我可以看到使用该子程序吗?似乎少打字,而不是每次都打字。 – JDS
答
use List::UtilsBy qw(rev_nsort_by);
foreach my $key (rev_nsort_by { $timeHash{$_} } keys %timeHash) {
...
}
在问题不是函数表示法,而是对'%timeHash'的引用...通常,我会写'keys%timeHash',但我不认为这个差异ce触发你得到的错误。 –
确实如此,代码中的其他地方还有其他错误。显然%timeHash没有声明。 –
上面我有“我的$ timeHash = {}” - 这是不正确的? – JDS