在Perl中,如何按其(数值)值的顺序打印哈希键?

Sla*_*ron 3 sorting perl hash

我有一个散列,其中键是字符串,值是一位数字; 这是一段哈希:

      'f92a0d43-a230-4bfd-b580-9eac5e0ce6cf' => 7,
      '26c4b622-969f-4861-bbab-dd506ea4b00a' => 1,
      'afb1f925-4109-4b1d-967f-3958106e0bc3' => 3,
      'a099a6dc-0c66-4683-94c3-29d6ef6947fd' => 1,
      'e71c4860-224d-4b8d-ae9e-4700e9e65a97' => 2,
Run Code Online (Sandbox Code Playgroud)

我想按降序值的顺序打印键.因此对于那里列出的切片,输出将是:

       'f92a0d43-a230-4bfd-b580-9eac5e0ce6cf' => 7
       'afb1f925-4109-4b1d-967f-3958106e0bc3' => 3
       'e71c4860-224d-4b8d-ae9e-4700e9e65a97' => 2
       '26c4b622-969f-4861-bbab-dd506ea4b00a' => 1
       'a099a6dc-0c66-4683-94c3-29d6ef6947fd' => 1
Run Code Online (Sandbox Code Playgroud)

具有相同值的键的顺序无关紧要.这个问题的答案: 在Perl中,如何打印对应于散列中最大值的键? 建议使用sort函数; 我有:

  my @values = sort { $b <=> $a } values %ID_hash;
Run Code Online (Sandbox Code Playgroud)

我遇到的问题实际上是按顺序打印键.

我试过了:

    foreach(@values) {
        my $cur = $_;
        print "$ID_hash{$cur}\t$cur\n";
    }
Run Code Online (Sandbox Code Playgroud)

哪个失败是因为我提供的是价值而不是钥匙.

我知道我总是可以将键/值对打印为制表符分隔文件并使用Unix版本的排序,但我确信有一种方法可以使用Perl.任何帮助都感激不尽.

Zai*_*aid 9

按哈希值中的值对键进行排序,然后使用排序键进行打印.

for my $key ( sort { $ID_hash{$b} <=> $ID_hash{$a} } keys %ID_hash ) {
    print join( "\t", $key, $ID_hash{$key} ), "\n";
}
Run Code Online (Sandbox Code Playgroud)

这个等价物可能会更清楚一些:

my @sorted_keys = sort { $ID_hash{$b} <=> $ID_hash{$a} } keys %ID_hash ;

print "$_\t$ID_hash{$_}\n" for @sorted_keys;
Run Code Online (Sandbox Code Playgroud)

  • 如果你想回到按键排序相同的值,你可以使用`$ ID_hash {$ b} <=> $ ID_hash {$ a} || $ a cmp $ b`. (2认同)