2012-10-08 284 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) { 
    ... 
}