2012-10-08 213 views
0

我认为我有正确的想法,但有一些语法/约定的事情搞乱了,因为我得到错误“全局符号%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}; 
} 
+0

在问题不是函数表示法,而是对'%timeHash'的引用...通常,我会写'keys%timeHash',但我不认为这个差异ce触发你得到的错误。 –

+0

确实如此,代码中的其他地方还有其他错误。显然%timeHash没有声明。 –

+0

上面我有“我的$ timeHash = {}” - 这是不正确的? – JDS

回答

2

在线

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

0
use List::UtilsBy qw(rev_nsort_by); 

foreach my $key (rev_nsort_by { $timeHash{$_} } keys %timeHash) { 
    ... 
}