2010-09-15 4 views
4

J'ai un grand hachage et j'ai un sous-ensemble de clés dont je veux extraire les valeurs, sans avoir à parcourir le hachage à la recherche de chaque clé (car je pense que cela prendra trop de temps).Dans un grand hachage Perl, comment extraire un sous-ensemble de clés particulières?

Je me demandais si je pouvais utiliser grep pour saisir un fichier avec un sous-ensemble de clés? Par exemple, quelque chose le long des lignes de:

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

juste curieux, quelle est la taille "grande"? –

+0

un million de lignes de données avec jusqu'à 200 paires clé/valeur dans chaque ligne – Jane

Répondre

4

Si le hachage ne peut pas contenir toutes les clés du sous-ensemble, utilisez une tranche de hachage et grep:

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

Vous pouvez omettre la partie grep si tous les clés sont contenues dans le hachage.

+0

Êtes-vous en train de dire que le @keys est un nouveau tableau avec seulement le sous-ensemble? – Jane

+0

@Jane: oui, correct. –

1

Jetez un oeil à perldata, et essayer quelque chose comme

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

Utilisez une tranche de hachage:

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) 

Deux points de clarification. (1) Vous n'avez jamais besoin d'itérer sur un hachage à la recherche de clés ou de valeurs particulières. Vous alimentez simplement le hachage d'une clé, et il renvoie la valeur correspondante - ou, dans le cas de tranches de hachage, vous fournissez une liste de clés et récupérez une liste de valeurs. (2) Il existe une différence entre defined et exists. Si vous êtes simplement intéressé à savoir si un hachage contient une clé spécifique, exists est le test correct.

+0

cela semblait être la réponse la plus utile en termes de compréhension de la solution. – qodeninja

Questions connexes