我有这样的数组哈希:
my @array1 = ("one", "two", "three", "four", "five");
my @array2 = ("banana", "pear", "apple");
my %hash = (
numbers => \@array1,
fruit => \@array2
);
我想使用数组的元素来访问密钥。例如,如果我有" banana",我想打印"水果"。
然而,当我print $hash{banana}
时,我得到"在打印中使用单位化值"。我如何正确访问它?
答案 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);