我需要获取哈希中某个键的所有值。哈希看起来像这样:
$bean = {
Key1 => {
Key4 => 4,
Key5 => 9,
Key6 => 10,
},
Key2 => {
Key7 => 5,
Key8 => 9,
},
};
我只需要Key4
,Key5
和Key6
的值。其余的不是兴趣点。我怎么能得到这些值?
更新:
所以我没有%bean
我只是将值添加到$bean
,如下所示:
$bean->{'Key1'}->{'Key4'} = $value;
希望这会有所帮助。
答案 0 :(得分:7)
foreach my $key (keys %{$bean{Key1}})
{
print $key . " ==> " . $bean{Key1}{$key} . "\n";
}
应打印:
Key4 ==> 4
Key5 ==> 9
Key6 ==> 10
答案 1 :(得分:2)
如果%bean
是哈希哈希值,则$bean{Key1}
是哈希引用。要像在简单哈希上那样对哈希引用进行操作,您需要取消引用它,如下所示:
%key1_hash = %{$bean{Key1}};
要访问哈希散列中的元素,可以使用如下语法:
$element = $bean{Key1}{Key4};
所以,这是一个打印$bean{Key1}
的键和值的循环:
print $_, '=>', $bean{Key1}{$_}, "\n" for keys %{$bean{Key1}};
或者,如果您只想要这些值,并且不需要键:
print $_, "\n" for values %{$bean{Key1}};
有关使用复杂数据结构的更多详细信息,请参阅以下Perl文档:perlreftut,perldsc和perllol。
答案 2 :(得分:1)
又一个解决方案:
for my $sh ( values %Bean ) {
print "$_ => $sh->{$_}\n" for grep exists $sh->{$_}, qw(Key4 Key5 Key6);
}
答案 3 :(得分:1)
有关使用Perl数据结构的许多示例,请参阅Perl Data Structure Cookbook。
答案 4 :(得分:0)
这样做的一个好方法 - 假设你发布的是一个例子,而不是一个例子 - 将是recursively。所以我们有一个函数,它搜索一个哈希查找我们指定的键,如果它找到一个值作为对另一个哈希的引用,则调用自己。
sub recurse_hash {
# Arguments are a hash ref and a list of keys to find
my($hash,@findkeys) = @_;
# Loop over the keys in the hash
foreach (sort keys %{$hash}) {
# Get the value for the current key
my $value = $hash->{$_};
# See if the value is a hash reference
if (ref($value) eq 'HASH') {
# If it is call this function for that hash
recurse_hash($value,@findkeys);
}
# Don't use an else in case a hash ref value matches our search pattern
for my $key (@findkeys) {
if ($key eq $_) {
print "$_ = $value\n";
}
}
}
}
# Search for Key4, Key5 and Key6 in %Bean
recurse_hash(\%Bean,"Key4","Key5","Key6");
给出这个输出:
Key4 = 4
Key5 = 9
Key6 = 10