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

syk*_*ker 5 arrays sorting perl hash

我正在尝试对数组进行排序,该数组哈希值.以下代码行:

sort @{ $hash{$item}{'lengths'} };
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

Useless use of sort in void context at ...
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 7

在Perl中,sort不修改数组; 它返回一个排序列表.您必须在某处分配该列表(返回原始数组或其他位置).

@{ $hash{$item}{'lengths'} } = sort @{ $hash{$item}{'lengths'} };
Run Code Online (Sandbox Code Playgroud)

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

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort @$arrayref;
Run Code Online (Sandbox Code Playgroud)

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

注意:正如salva指出的那样,默认情况下sort会进行字符串比较.你可能想要一个数字排序,你可以使用sort { $a <=> $b }而不仅仅是sort:

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort { $a <=> $b } @$arrayref;
Run Code Online (Sandbox Code Playgroud)

但这与您询问的警告信息无关.


Rag*_*ram -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";
Run Code Online (Sandbox Code Playgroud)

它工作得很好,输出是

1 5 6 7 7 9
Run Code Online (Sandbox Code Playgroud)

你使用的是哪个 Perl 版本?

  • 您没有收到警告,因为您没有在 void 上下文中使用“sort”。当“sort”之前没有“@narr =”时,就会产生警告。 (3认同)