繁体   English   中英

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

[英]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 strictuse 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM