3

谁能告诉我我在这里做错了什么?我已经尝试了几乎所有我能想到的数组/哈希类型和排序查询的组合,但似乎无法让它发挥作用。

我正在尝试按以下方式对下面的哈希引用进行排序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

4 回答 4

6

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

另外, this $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
于 2014-04-07T15:50:24.077 回答
3

只是想提供其他答案的来源和工作代码示例。就像他们说的那样,您正在keys使用参数的哈希引用进行调用。根据文档


从 Perl 5.14 开始,键可以采用标量 EXPR,它必须包含对 unblessed 散列或数组的引用。该参数将被自动取消引用。密钥的这一方面被认为是高度实验性的。在 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}.

于 2014-04-07T15:59:27.880 回答
2

简直了keys %$test。的参数keys必须是散列,而不是散列引用。\%${test}$test, 一个 ref 相同。

并使用$test->{$a}, not $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;,至少对于调试来说是这样。

于 2014-04-07T15:52:31.157 回答
0

我能发现的唯一错误是\%{$test}在应该使用 hash 的地方使用 hash ref %$testkeys与它一起工作。

于 2014-04-07T15:52:03.510 回答