Perl按哈希值哈希值或散列哈希值中的哈希值排序

som*_*ser 3 arrays sorting perl hash hash-of-hashes

谁能告诉我这里我做错了什么?我已经尝试了几乎所有可能的数组/散列类型和排序查询的组合,我能想到并且似乎无法使其工作.

我试图通过以下方式对哈希引用进行排序value1:

my $test = {
    '1' => { 'value1' => '0.001000', 'value2' => 'red'},
    '2' => { 'value1' => '0.005000', 'value2' => 'blue'},
    '3' => { 'value1' => '0.002000', 'value2' => 'green'},
    '7' => { 'value1' => '0.002243', 'value2' => 'violet'},
    '9' => { 'value1' => '0.001005', 'value2' => 'yellow'},
    '20' => { 'value1' => '0.0010200', 'value2' => 'purple'}
};
Run Code Online (Sandbox Code Playgroud)

使用此排序循环:

foreach (sort { $test{$a}->{'value1'} <=> $test{$b}->{'value1'} } keys \%{$test} ){
    print "key: $_ value: $test->{$_}->{'value1'}\n"
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

key: 1 value: 0.001000
key: 3 value: 0.002000
key: 7 value: 0.002243
key: 9 value: 0.001005
key: 2 value: 0.005000
key: 20 value: 0.0010200
Run Code Online (Sandbox Code Playgroud)

我试过整数,似乎也发生了同样的事情.

我实际上并不需要遍历哈希,我只是想让它订购以供以后使用.它很容易用哈希数组来做,但哈希哈希不是这样吗?

Mil*_*ler 6

不要在引用上调用键.在实际哈希上调用它.

此外,这$test{$a}->应该是$test->{$a},因为$test是一个哈希引用.

foreach (sort { $test->{$a}{'value1'} <=> $test->{$b}{'value1'} } keys %{$test} ){
    print "key: $_ value: $test->{$_}->{'value1'}\n"
}
Run Code Online (Sandbox Code Playgroud)

如果你有use strict;use warnings;开启,你将已经得到了以下错误,提醒您一个问题:

Global symbol "%test" requires explicit package name
Run Code Online (Sandbox Code Playgroud)