我有一个大哈希并且有一个我想要提取值的键子集,而不必遍历哈希查找每个键(因为我认为这将花费太长时间)。
我想知道我是否可以使用grep
来获取包含密钥子集的文件?例如,类似于:
my @value = grep { defined $hash{$_}{subsetofkeysfile} } ...;
答案 0 :(得分:7)
使用哈希切片:
my %hash = (foo => 1, bar => 2, fubb => 3);
my @subset_of_keys = qw(foo fubb);
my @subset_of_values = @hash{@subset_of_keys}; # (1, 3)
两点澄清。 (1)您永远不需要遍历查找特定键或值的哈希。您只需向哈希提供一个密钥,然后返回相应的值 - 或者,如果是哈希切片,则提供密钥列表并返回值列表。 (2)defined
和exists
之间存在差异。如果您只关心哈希是否包含特定密钥,exists
是正确的测试。
答案 1 :(得分:4)
如果散列可能不包含子集中的任何键,请使用散列片和grep:
my @values = grep defined, @hash{@keys};
如果散列中包含所有键,则可以省略grep部分。
答案 2 :(得分:1)
查看 perldata , 并尝试类似
的内容foreach (@hash{qw[key1 key2]}) {
# do something
}