2012-11-21 95 views
3

我的哈希看起來是這樣的:grep的嵌套哈希perl的

$VAR1 = { 
     '1238' => { 
        'OUT3FA_5' => 65, 
        'SEV' => '3_major', 
        'OUT3A_5' => 20, 
        'OUT3-Fix' => 45, 
        'IN1' => 85 
       }, 
     '1226' => { 
        'OUT3FA_5' => 30, 
        'SEV' => '4_minor', 
        'OUT3A_5' => 5, 
        'OUT3-Fix' => 25, 
        'IN1' => 40 
       }, 
     '1239' => { 
        'OUT3FA_5' => 56, 
        'SEV' => '4_minor', 
        'OUT3A_5' => 34, 
        'OUT3-Fix' => 22, 
        'IN1' => 94 
       }] 

我希望我的Perl腳本只返回對應於「SEV」 =「4_minor」在這種情況下的值,它會返回:

'1226' => { 
        'OUT3FA_5' => 30, 
        'SEV' => '4_minor', 
        'OUT3A_5' => 5, 
        'OUT3-Fix' => 25, 
        'IN1' => 40 
       }, 
     '1239' => { 
        'OUT3FA_5' => 56, 
        'SEV' => '4_minor', 
        'OUT3A_5' => 34, 
        'OUT3-Fix' => 22, 
        'IN1' => 94 
       } 

但是當我用grep這樣的:

my $Sev_Logged = "4_minor"; 
my $node_hash = { 
Week => [ 
    grep { $hash{$_}{'SEV'} eq $Sev_Logged } %hash, 
    ] 
    }; 

# Print in json format 
my $json = encode_json \%$node_hash; 
print $json; 

它只返回:

{"Week":["1226","1239"]} 

而且我希望它返回所有其他數據,對應於每個包含SEV =「4_minor」的星期。 我該怎麼做? 任何幫助將不勝感激。

+0

你有一個無與倫比的]在你的第一個代碼塊。另外,當您應該訪問您的第一個代碼塊所在的hashref時,您正試圖訪問grep行末尾的散列。嘗試使用'keys%{$ hash}'之類的東西從hashref中獲取信息。 – jmcneirney

回答

8

當你的手一%hash過那種方式grep那麼Perl interpretes散列作爲鍵和值偶數名單 - 導致grep {...}塊被稱爲一次每個鍵並每值(而不是被稱爲每對鍵&值)。

嘗試這樣:

{ map { ($_ => $hash{$_} } grep { $hash{$_}->{SEV} eq $Sev_Logged } keys %hash } 

grep保持了其SEV場你想要的東西相匹配的哈希鍵。之後map重建一個散列(因爲那時我們只有從grep返回的鍵),最後我們將它轉​​換爲散列引用。

+0

好吧,我明白了,我早些時候嘗試使用地圖,但我想我做錯了,您的解決方案的作品謝謝你! – salamey