2013-08-02 94 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;