簡體   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