2013-08-02 134 views
1
my %hash1 = (
    a => ["turkey, mexico"], 
    b => ["india, china"], 
    c => ["england, vietnam"], 
    d => ["usa"], 
); 

我想獲取墨西哥相關密鑰。 我怎樣才能得到它?Perl:查找數組散列的密鑰

嘗試:

print @($a{$hash1{"mexico"}}) 
+0

你嘗試過這麼遠嗎?我會構建一個將單個國家映射到密鑰的反向散列。 – amon

+0

@amon:我想以另一種方式創建它,但無法確定映射是否會增加很多。 – iDev

回答

4

也許如果你既可以通過哈希鍵進行迭代,並返回一個包含它的陣列,或者如果你創建另一個哈希值。對於第二種,它可能看起來像這樣:

my %newhash; 
for my $key (keys %hash1) { 
    my @list = split /,/=> $hash1{$key}[0]; 
    # or perhaps: my @list = map split(/, /, $_), @{ $hash1{$key} }; 
    for (@list) { 
    $newhash{$_} = $key; 
    } 
} 
$newhash{mexico} eq 'a'; #true 

這不是非常有效,但它會工作。

+1

幾乎......如果你看看iDev實際上已經有的散列,你會看到每個arrayref只包含一個像「'土耳其,墨西哥」''的字符串,而不是多個字符串,其中一個會是'「墨西哥」'。 – amon

+0

謝謝。這真的有幫助 – iDev

+0

@amon - 你是對的,我完全沒有看到。在這種情況下,你需要在第二個for循環之前拆分字符串,以便它仍然可以工作。更新了代碼以顯示此內容。 – Jeremy

2
print grep { $hash1{$_}[0] =~ /mexico/ } keys %hash1; 

,並在哈希值與多個元素數組的情況下,

print grep { grep { $_ eq "mexico" } @{$hash1{$_}} } keys %hash1;