arrays - 按值对哈希值进行排序

标签 arrays perl hash-of-hashes

我有以下数据结构

my %HoH = {
      'foo1' => {
                        'bam' => 1,
                        'zip' => 0,
                      },
      'foo2' => {
                         'bam' => 0,
                         'zip' => 1,
                         'boo' => 1
                       }
    };

我想按照“zip”中存储的值从大到小对 KEY1(foo1 或 foo2)进行排序。

这就是我的做法。

use strict; use warnings;
use Data::Dumper;
my @sorted;
foreach my $KEY1 (keys %HoH) {
    # sort KEY1 by the value 'zip' maps to in descending order
    @sorted = sort {$HoH{$KEY1}{'zip'}{$b} <=> 
        $HoH{$KEY1}{'zip'}{$a}} keys %HoH;
}

print Dumper(\@sorted);

我收到一个奇怪的警告:引用发现 test.pl 第 6 行需要偶数大小的列表。 另外 print Dumper(\@sorted); 正在打印

$VAR1 = [
      'HASH(0x1b542a8)'
    ];

何时应该打印

$VAR1 = [
      ['foo2', 'foo1']
    ];

因为 foo2 有 1 个 zipfoo1 有 0 zip

最佳答案

  • %HoH被声明为哈希,但被定义为哈希引用。使用括号(...)而不是大括号{...} .
  • 您不需要循环遍历哈希来对其进行排序。 Sort 会处理这个问题。
  • 如果你sort {...} keys %HoH ,然后是特殊变量 $a$b代表 %HoH 的键因为它执行排序。
  • $a$b是相反的顺序,因为您的预期结果是按降序排列的。 (更新:哦,我刚刚注意到你一开始就有这个。)
  • zip嵌套哈希中的值为 $HoH{$KEY}{'zip'} ,这就是您应该排序的依据。

    use strict;
    use warnings;
    use Data::Dumper;
    
    my %HoH = (
          'foo1' => {
                            'bam' => 1,
                            'zip' => 0,
                          },
          'foo2' => {
                             'bam' => 0,
                             'zip' => 1,
                             'boo' => 1
                           }
        );
    
    my @sorted = sort {$HoH{$b}{'zip'} <=> $HoH{$a}{'zip'}} keys %HoH;
    print Dumper \@sorted;
    

请注意,此代码的结果将为您提供一个数组:

$VAR1 = [
      'foo2',
      'foo1'
];

...不是嵌套数组:

$VAR1 = [
     ['foo2', 'foo1']
];

关于arrays - 按值对哈希值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16138652/

相关文章:

java - 从最低到最高打印数组而不排序

c++ - 在 C++ 中初始化结构中的 const 数组

perl - 如何使用 ModPerl::Registry(mod_perl 处理程序)检测 Perl 中的 Web 脚本是否运行?

perl - 我可以在 Perl 中重命名另一个散列中的散列键吗?

c - 如何在 C 中使用另一个结构体内部的结构体(同时使用 malloc 和 2D 数组?)

c - 操纵字符数组

regex - 使用什么代替Smartmatch?

perl - 使用 Test::More,如何在测试函数中打印调试消息?

ruby - 访问任意深度的嵌套哈希值的最像 ruby​​ 的方法是什么?

ruby - 在 ruby​​ 中合并一些复杂的哈希值