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