[英]Perl sort by hash value in array of hashes or 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
我试过整数,似乎也发生了同样的事情。
我实际上并不需要遍历哈希,我只是想让它订购以供以后使用。 它很容易用哈希数组来做,但哈希哈希却不是这样。
不要在引用上调用键。 在实际哈希上调用它。
此外,这个$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
只想提供其他答案的来源,以及一个有效的代码示例。 就像他们说的那样,你正在使用参数的哈希引用来调用keys
。 根据文件 :
从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 strict
并use warnings
并将哈希引用更改为哈希值%{test}
。
它只是keys %$test
。 keys
的参数必须是哈希值,而不是hashref。 \\%${test}
与$test
相同,参考。
并使用$test->{$a}
,而不是$test{$a}
,因为$test
是一个hash-ref,而不是一个hash。
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;
通常会有很大帮助use warnings;
,至少是为了调试。
我能发现的唯一错误就是使用hash ref \\%{$test}
,你应该使用hash %$test
。 keys
用于此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.