В большом хэше Perl как извлечь подмножество определенных ключей? - PullRequest
4 голосов
/ 15 сентября 2010

У меня большой хэш и подмножество ключей, для которых я хочу извлечь значения, без необходимости перебирать хеш, ища каждый ключ (как я думаю, это займет слишком много времени).

Мне было интересно, могу ли я использовать grep, чтобы получить файл с подмножеством ключей? Например, что-то вроде:

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

Ответы [ 3 ]

7 голосов
/ 15 сентября 2010

Используйте ломтик хеша:

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 является правильным тестом.

4 голосов
/ 15 сентября 2010

Если хеш не может содержать ключей из подмножества, используйте срез хеша и grep:

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

Вы можете опустить часть grep, если все ключи содержатся в хэше.

1 голос
/ 15 сентября 2010

Посмотрите на perldata , и попробуйте что-то вроде

foreach (@hash{qw[key1 key2]}) {
    # do something
    }
...