查找子哈希中的键,而无需遍历整个哈希

问题描述 投票:0回答:2

我有一个看起来像这样的哈希:

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”键,但我不是。

谢谢!

perl hash
2个回答
1
投票
使用values

for my $inner_hash (values %$hash) { say grep exists $inner_hash->{$_}, @list; }


0
投票
您必须循环播放所有的level1键。但是,如果您不需要知道哪些键匹配,而仅关心任何键的存在,则不必显式地询问列表中的每个成员。你可以说

foreach my $k (keys %hash) { if ( @{ $hash{$k} }{ @list } ) { } }

哈希切片将返回子哈希中列表中具有匹配键的所有值。列表中不在子哈希中的键将被忽略。 
© www.soinside.com 2019 - 2024. All rights reserved.