Arrays Perl在哈希数组或哈希数组中按哈希值排序

Arrays Perl在哈希数组或哈希数组中按哈希值排序,arrays,perl,sorting,hash,hash-of-hashes,Arrays,Perl,Sorting,Hash,Hash Of Hashes,有人能告诉我我做错了什么吗?我已经尝试了我能想到的数组/散列类型和排序查询的几乎所有可能的组合,但似乎无法实现 我正在尝试按value1对下面的哈希引用进行排序: my $test = { '1' => { 'value1' => '0.001000', 'value2' => 'red'}, '2' => { 'value1' => '0.005000', 'value2' => 'blue'}, '3' => { 'value

有人能告诉我我做错了什么吗?我已经尝试了我能想到的数组/散列类型和排序查询的几乎所有可能的组合,但似乎无法实现

我正在尝试按
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"
}
我尝试过整数,同样的事情似乎也发生了


我实际上不需要遍历散列,我也只需要将其排序以供以后使用。使用散列数组很容易,但使用散列数组就不那么容易了。

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

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

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

我能发现的唯一错误是使用了hash ref
\%{$test}
,您应该在其中使用hash
%$test
<代码>键与此配合使用。

这只是
键%$test
keys
的参数必须是散列,而不是hashref
\%${test}
$test
相同,是一个ref

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

foreach (sort { $test->{$a}->{'value1'} <=> $test->{$b}->'{value1'} } keys %$test) {
    print "key: $_ value: $test->{$_}->{'value1'}\n"
}
foreach(排序{$test->{$a}->{'value1'}$test->{$b}->{value1'}}键%$test){
打印“键:$\uvalue:$test->{$\u}->{'value1'}\n”
}
或者是一个简短的形式,加上一些语法上的修饰:你可以省略第一个箭头后面的附加箭头。在处理散列时,不必引用字符串文本键

foreach (sort { $test->{$a}{value1} <=> $test->{$b}{value1} } keys %$test) {
    print "key: $_ value: $test->{$_}{value1}\n"
}
foreach(排序{$test->{$a}{value1}$test->{$b}{value1}}}键%$test){
打印“键:$\uvalue:$test->{$\u}{value1}\n”
}

打开
使用警告通常会有很大帮助,至少用于调试。

只是想为其他答案提供一个源代码和一个工作代码示例。正如他们所说,您正在调用
,并使用散列引用作为参数。根据报告:


从Perl5.14开始,键可以采用标量表达式,它必须 包含对未删除哈希或数组的引用。这场争论将继续下去 将自动取消引用。考虑了键的这一方面 高度实验性。确切的行为可能会在未来发生变化 Perl版本


然而,这对我来说确实有效:

#!/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"
}
这与使用散列引用作为
键的输入有关,我不建议这样做


我建议按照其他问题的建议,添加
use strict
use warnings
并将哈希引用更改为哈希,
%{test}

Re。“我实际上也不需要循环遍历哈希,我只需要将其排序以供以后使用。”您不能对哈希进行排序。您可以按一定的顺序遍历密钥,但哈希本身不会被排序。谢谢!这就是我最终想要的答案。回到阵列然后。。。我假设每次需要使用数组时,对数组进行一次排序要比对哈希进行一次排序快,在我目前的情况下,哈希是每秒多个(我想你可以在遍历键时创建一个新的哈希)。同样,你不能对哈希进行排序。您可以将已排序的键列表存储在一个数组中,并使用该列表设置用于迭代哈希的顺序,但只有在不从哈希中添加或删除元素的情况下,这才有效<代码>我的@sorted=排序键%hash;对于(@sorted){…}
谢谢。我可以发誓我试过了,但我想我是在用我的%test=(…);如果启用警告,则表示正在比较的值未定义
foreach (sort { $test->{$a}{value1} <=> $test->{$b}{value1} } keys %$test) {
    print "key: $_ value: $test->{$_}{value1}\n"
}
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)