排序数组,它是Perl中Hash中的值

时间:2010-12-08 07:39:34

标签: arrays perl sorting hash

我正在尝试对数组进行排序,这是哈希中的值。以下代码行:

sort @{ $hash{$item}{'lengths'} };

产生以下错误:

Useless use of sort in void context at ...

4 个答案:

答案 0 :(得分:7)

在Perl中,sort不会修改数组;它返回一个排序列表。您必须将该列表分配到某处(或者返回原始数组,或者其他地方)。

@{ $hash{$item}{'lengths'} } = sort @{ $hash{$item}{'lengths'} };

或者,(特别是如果数组深入嵌套哈希):

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort @$arrayref;

您的原始代码正在对数组进行排序,然后丢弃已排序的列表,这就是它产生该警告的原因。

注意:正如salva指出的那样,默认情况下sort会进行字符串比较。您可能需要使用sort { $a <=> $b }而非sort进行数字排序:

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort { $a <=> $b } @$arrayref;

但这与您提出的警告信息无关。

答案 1 :(得分:3)

Perl的sort没有“就地”重新排序列表。它实际上是列表的副本,然后进行排序和返回。所以按照cjm的建议来做,

您可以在此link上阅读类似的问题(参见示例部分

答案 2 :(得分:2)

另请注意,如果要对长度进行排序,则必须使用数字比较:

my $lengths = $hash{$item}{'lengths'};
@$lengths = sort { $a <=> $b } @$lengths;

答案 3 :(得分:-2)

我试过这样的事情

my %lrn_hash;

$lrn_hash{1} = 1;
@{$lrn_hash{1}{VALS}} = (6,7,1,5,7,9);

@narr = sort @{$lrn_hash{1}{VALS}};
print "@narr\n";

它工作正常,输出

1 5 6 7 7 9

您使用的是perl版本吗?