如何按数组大小对数组的哈希进行排序

Dir*_*uin 3 perl

我有一个数组哈希,我想按数组大小排序.

到目前为止,这是我的代码:

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";
}
Run Code Online (Sandbox Code Playgroud)

我理解如何获得单个数组的大小,但我不确定如何将它与sort函数结合起来.

我从这里复制了最后一个foreach块,但该解决方案对我不起作用,因为我的输出没有被订购.我对最后一段代码有一些疑问:

  1. 我没有看到前面提到的$ b和$ a.这是sort函数理解的内置引用吗?
  2. 解决方案似乎适用于原始海报,但在我的情况下不起作用.然而我们最初的目标是相似的.为了获得基于数组大小的有序输出,我缺少什么?
  3. 按数组大小按升序和降序对数组哈希值进行排序的最佳方法是什么?

Ben*_*hul 6

你很亲密 如上所述,您正在比较数组引用,它们或多或少是内存地址.我稍微修改了你的代码,以便为你提供所需内容:

foreach my $key ( sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array ) {
    print "key: $key\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 由于`<=>`运算符应用标量上下文,因此不需要调用`scalar`.`@ {$ hash_array {$ b}} <=> @ {$ hash_array {$ a}}`没问题. (2认同)