1

假设我想%hash通过在另一个哈希 ( ) 中查找比较来对数组的哈希 ( ) 进行排序%comparator

我认为以下方法会起作用,但事实并非如此。

for ($bin_ix=1; $bin_ix<scalar(keys(%cluster_bins)); $bin_ix++) {    
   $hash{$bin_ix} = sort {$comparator{$a} <=> $comparator{$b} $hash{$bin_ix}};
} 

它抱怨:Missing operator before %hash。我错过了什么?

4

2 回答 2

4

实际上,它说

Scalar found where operator expected at -e line 2, near "} $hash"
        (Missing operator before  $hash?)

它在抱怨您的 misplaced },但还有第二个问题:$hash{$bin_ix}仅仅是对数组的引用,而不是数组。你要

@{ $hash{$bin_ix} } =
   sort { $comparator{$a} <=> $comparator{$b} }
      @{ $hash{$bin_ix} };
于 2012-09-17T18:36:19.653 回答
2

Ikegami 已经回答了您的直接问题,但我想指出,如果您确实想对 中的所有数组进行排序%hash,编写循环的更简单方法是:

foreach my $array ( values %hash ) {
    @$array = sort { $comparator{$a} <=> $comparator{$b} } @$array;
}

即使您确实只想从1to对键的数组进行排序scalar keys %cluster_bins,TLP 的建议仍然会更清晰:

foreach my $bin_idx ( 1 .. keys %cluster_bins ) {
    my $array = $hash{ $bin_idx };
    @$array = sort { $comparator{$a} <=> $comparator{$b} } @$array;
}
于 2012-09-17T19:05:52.993 回答