【问题标题】:Using an element in a Hash of Arrays to access the key使用数组哈希中的元素来访问密钥
【发布时间】:2017-03-26 04:12:03
【问题描述】:

我有一个这样的数组散列:

my @array1 = ("one", "two", "three", "four", "five");
my @array2 = ("banana", "pear", "apple");

my %hash = (
    numbers => \@array1,
    fruit => \@array2
);

我想使用数组的一个元素来访问密钥。例如,如果我有“香蕉”,我想打印“水果”。

但是,当我执行print $hash{banana} 时,我得到“在打印中使用统一化值”。如何正确访问它?

【问题讨论】:

  • 哈希查找,就像数组查找一样,是单向的。给定一个键,你可以直接找到对应的值,但是使用一个值来查找一个键是行不通的,你必须写一个搜索。
  • 有什么办法可以翻转它,这样我就可以拥有多个相同值的键?
  • 散列值是独立的,但您可以将它们设置为相同的。您可以使用八个键(数组中的字符串)以及 numbersfruit 作为值来构建散列。
  • 好的,感谢您的帮助。我看到的唯一问题是数组每次都不相同,因此我无法将它们永久添加为键。
  • 那么您需要在运行时在for 循环中构建您的哈希,或者使用map,如下面的答案所示。

标签: arrays perl hash


【解决方案1】:

正如 Borodin 在 cmets 中已经提到的,没有直接的方法可以实现这一点。但是你可以通过以下方式做到这一点:

sub getKeyByValue {
    my ($hashref, $val) = @_; # get sub arguments
    for (keys %$hashref) {
        # find key by value and give back the key
        return $_ if grep $_ eq $val, @{$hashref->{$_}};
    }
    return undef; # value not found
}

my $key = getKeyByValue(\%hash, 'banana');
print $key;

输出:fruit

只需将哈希引用和您想要的值提供给子例程getKeyByValue(),它就会返回相应的键。如果找不到该值,子程序将返回未定义的值undef。如果你的数据结构真的很大,那么这种琐碎的搜索显然不是最有效的解决方案。

注意:如果值banana被存储多次(在多个key下),那么这个子程序当然只会返回第一个随机匹配(key)。如果您对可能存储banana 的所有键感兴趣,则必须修改子例程。

有很多方法可以做到这一点,就像大多数时候在 Perl 中一样。例如,您可以反转哈希并创建一个新哈希(参见perlfaq4 中的示例)。

【讨论】:

    【解决方案2】:

    您可以创建两个不同的哈希:

    my %hash1 = map { $_ => "numbers" } @array1;
    my %hash2 = map { $_ => "fruit" } @array2;
    

    并将它们连接起来:

    my %hash = (%hash1, %hash2);
    

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 2021-08-01
      • 2011-12-14
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多