1

私は正しい考えを持っていると思いますが、「グローバルシンボル %timeHash には明示的なパッケージ名が必要です」というエラーが表示されるため、混乱している構文/規則がいくつかあります。

コード:

foreach $key (sort hashValueDescendingNum (keys(%timeHash))) {
   print "\t$key\t\t $timeHash{$key}\n";
}



sub hashValueDescendingNum {
   my $hash = shift;
   $hash{$b} <=> $hash{$a};
}
4

2 に答える 2

3

列をなして

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;
}

コードは %hash を通過するため効率的ではありませんが、参照の方が適切です。

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;
}
于 2012-10-08T23:33:16.137 に答える
0
use List::UtilsBy qw( rev_nsort_by );

foreach my $key ( rev_nsort_by { $timeHash{$_} } keys %timeHash ) {
    ...
}
于 2012-10-10T10:26:27.037 に答える