使用Hash of Arrays中的元素来访问密钥

时间:2017-03-25 16:30:21

标签: arrays perl hash

我有这样的数组哈希:

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

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

我想使用数组的元素来访问密钥。例如,如果我有" banana",我想打印"水果"。

然而,当我print $hash{banana}时,我得到"在打印中使用单位化值"。我如何正确访问它?

2 个答案:

答案 0 :(得分:1)

正如鲍罗丁在评论中已经提到的那样,没有直接的方法来实现这一目标。但你可以通过以下方式完成:

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被存储多次(在多个键下),则该子例程当然只返回第一个随机匹配(键)。如果您对可能存储banana的所有密钥感兴趣,则必须修改子例程。

有许多方法可以做到这一点,就像Perl中的大部分时间一样。例如,您可以反转哈希值并创建一个新哈希值(请参阅perlfaq4中的示例)。

答案 1 :(得分:0)

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

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

并连接它们:

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