我有一个看起来像这样的哈希:
my $hash = {
level1_f1 => {
level2_f1 => 'something',
level2_f2 => 'another thing'
},
level1_f2 => {
level2_f3 => 'yet another thing',
level2_f4 => 'bla bla'
level2_f5 => ''
}
...
}
我还获得了与“ level2”键相对应的值的列表,我想知道您是否存在于哈希中。
@list = ("level2_f2", "level2_f4", "level2_f99")
我不知道@list的每个元素属于哪个“ level1”键。我认为,找到它们是否存在的唯一方法是使用一个foreach循环通过@list,另一个foreach循环通过%hash的键并检查
foreach my $i (@array) {
foreach my $k (keys %hash) {
if (exists $hash{$k}{$list[$i]})
}
}
但我想知道是否有更高效或更优雅的方法来做到这一点。我找到的所有答案都要求您知道“ level1”键,但我不是。
谢谢!
for my $inner_hash (values %$hash) {
say grep exists $inner_hash->{$_}, @list;
}
foreach my $k (keys %hash) {
if ( @{ $hash{$k} }{ @list } )
{
}
}
哈希切片将返回子哈希中列表中具有匹配键的所有值。列表中不在子哈希中的键将被忽略。