在大型Perl哈希中,如何提取特定键的子集?

时间:2010-09-15 09:26:37

标签: perl hash key

我有一个大哈希并且有一个我想要提取值的键子集,而不必遍历哈希查找每个键(因为我认为这将花费太长时间)。

我想知道我是否可以使用grep来获取包含密钥子集的文件?例如,类似于:

 my @value = grep { defined $hash{$_}{subsetofkeysfile} } ...;

3 个答案:

答案 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)definedexists之间存在差异。如果您只关心哈希是否包含特定密钥,exists是正确的测试。

答案 1 :(得分:4)

如果散列可能不包含子集中的任何键,请使用散列片和grep:

my @values = grep defined, @hash{@keys};

如果散列中包含所有键,则可以省略grep部分。

答案 2 :(得分:1)

查看 perldata ,  并尝试类似

的内容
foreach (@hash{qw[key1 key2]}) {
    # do something
    }