【问题标题】:Perl: Find key for a hash of arrays [duplicate]Perl:查找数组哈希的键[重复]
【发布时间】:2013-08-04 08:11:33
【问题描述】:
    my %hash1 = (
    a => ["turkey, mexico"],
    b => ["india, china"],
    c => ["england, vietnam"],
    d => ["usa"],
);

我想获取与墨西哥相关的密钥。 我怎样才能得到它?

试过了:

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

【问题讨论】:

  • 到目前为止您尝试过什么?我会构建一个反向散列,将单个国家映射到键。
  • @amon:我想用另一种方式创建它,但不确定映射是否会增加很多。

标签: perl hash hashmap


【解决方案1】:
print grep { $hash1{$_}[0] =~ /mexico/ } keys %hash1;

如果哈希值是具有多个元素的数组,

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

【讨论】:

    【解决方案2】:

    也许你要么遍历散列键并返回包含它的数组,要么创建另一个散列。对于第二个,它可能看起来像这样:

    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
    

    这不是非常有效,但它会起作用。

    【讨论】:

    • 几乎……如果您查看 iDev 实际拥有的哈希值,您会发现每个 arrayref 只包含一个字符串,如 "turkey, mexico",而不是多个字符串,其中一个是 "mexico"。跨度>
    • 谢谢。这确实很有帮助
    • @amon - 你说得对,我完全没有看到。在这种情况下,您需要在第二个 for 循环之前拆分字符串,以便它仍然有效。更新了代码以显示这一点。
    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2012-06-12
    • 2018-04-07
    相关资源
    最近更新 更多