我有一个数组哈希,我想按数组大小排序。
到目前为止,这是我的代码:
use strict;
use warnings;
my %hash_array = (
"array_1" => ["apple", "ball", "cat"],
"array_2" => ["def", "leppard", "rocks", "too"],
"array_3" => ["italian", "pastry", "missing", "cherry", "top"],
);
# Length of array_1
my $array_1_size = @{$hash_array{"array_1"}};
print "Should print three: $array_1_size\n";
# Found this here: https://stackoverflow.com/questions/15722286
# But my result remains unsorted
foreach my $key ( sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array ) {
print "key: $key\n";
}
我理解如何获得单个数组的大小,但我不确定如何将其与sort函数组合。
我从here复制了最后一个foreach块,但该解决方案对我不起作用,因为我的输出没有订购。我对最后一段代码有一些疑问:
答案 0 :(得分:6)
你很亲密。如上所述,您正在比较数组引用,它们或多或少是内存地址。我稍微修改了你的代码,以便为你提供所需的内容:
foreach my $key ( sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array ) {
print "key: $key\n";
}
答案 1 :(得分:4)
sort函数就是 - 匿名子。你不仅限于一个比较,你只需要完成返回-1,0或1的东西。是的,$a
和$b
是被比较的两个值 - 它们可以是标量或参考文献。
您可以像这样解决问题:
foreach my $key (sort {
my $length_a = scalar @{$hash_array{$a}};
my $length_b = scalar @{$hash_array{$b}};
$length_b <=> $length_a
} keys %hash_array) {
...
}
我知道可以简化为单行,但重点是展示如何在sort
子内进行多次比较。
答案 2 :(得分:1)
for my $key (sort{ my ($x,$y)=@hash_array{$a,$b}; @$y <=> @$x } keys %hash_array) {
print "key: $key\n";
}