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

时间:2014-04-07 15:44:00

标签: arrays perl sorting 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'}
};

使用此排序循环:

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

我明白了:

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

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

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

4 个答案:

答案 0 :(得分:6)

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

此外,此$test{$a}->应为$test->{$a},因为$test是哈希引用。

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

如果您启用了use strict;use warnings;,则会出现以下错误,提醒您出现问题:

Global symbol "%test" requires explicit package name

答案 1 :(得分:3)

只是想为其他答案提供一个来源,以及一个有效的代码示例。就像他们说的那样,你正在使用参数的哈希引用来调用keys。根据{{​​3}}:


  

从Perl 5.14开始,密钥可以采用标量EXPR,必须使用   包含对未经处理的散列或数组的引用。论证会   被自动解除引用。考虑密钥的这个方面   高度实验性。确切的行为可能在未来发生变化   Perl的版本。

for (keys $hashref) { ... }
for (keys $obj->get_arrayref) { ... }

然而,这对我有用:

#!/usr/bin/perl
use strict;
use warnings;

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'}
};


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

示例:

matt@mattpc:~/Documents/test/10$ perl test.pl 
key: 1 value: 0.001000
key: 9 value: 0.001005
key: 20 value: 0.0010200
key: 3 value: 0.002000
key: 7 value: 0.002243
key: 2 value: 0.005000
matt@mattpc:~/Documents/test/10$ perl --version
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
(with 88 registered patches, see perl -V for more detail)

这是使用哈希引用作为keys的输入,我不建议这样做。

我建议您遵循其他问题的建议并添加use strictuse warnings并将哈希引用更改为哈希%{test}

答案 2 :(得分:2)

这只是keys %$testkeys的参数必须是哈希值,而不是hashref。 \%${test}$test相同,是参考号。

并使用$test->{$a},而不是$test{$a},因为$test是散列引用,而不是散列。

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

或带有一些语法糖的较短形式:您可以在第一个之后省略其他箭头。在处理哈希值时,您不必引用字符串文字键。

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

打开use warnings;通常会有很大帮助,至少在调试时是这样。

答案 3 :(得分:0)

我能发现的唯一错误是使用hash ref \%{$test},你应该使用hash %$testkeys与此合作。