2011-04-04 5 views
2

Étant donné la variable suivante:Comment faire une boucle dans un hachage?

$test = { 
    '1' => 'A', 
    '2' => 'B', 
    '3' => 'C', 
    '4' => 'G', 
    '5' => 'K', 
} 

Comment boucle à travers toutes les affectations sans savoir quelles touches je?

Je voudrais remplir une boîte de sélection avec les résultats comme étiquette et les clés comme valeurs cachées.

Répondre

5

Il suffit de faire une boucle foreach sur les touches:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $test = { 
    '1' => 'A', 
    '2' => 'B', 
    '3' => 'C', 
    '4' => 'G', 
    '5' => 'K', 
}; 

foreach my $key(keys %$test) { 
    print "key=$key : value=$test->{$key}\n"; 
} 

sortie:

key=4 : value=G 
key=1 : value=A 
key=3 : value=C 
key=2 : value=B 
key=5 : value=K 
+0

+1 qui était exactement ce que je cherchais – Thariama

+0

N.B. vous pouvez également utiliser un 'sort' précédant la fonction' keys' pour obtenir vos données dans une sorte d'ordre utile/prévisible –

3

Vous pouvez savoir quelles touches vous avez avec keys

my @keys = keys %$test; # Note that you need to dereference the hash here 

Ou vous pourrait faire tout le tout en un seul passage:

print map { "<option value='$_'>$test->{$_}</option>" } keys %$test; 

Mais vous voudrez probablement une sorte d'ordre:

print map { "<option value='$_'>$test->{$_}</option>" } sort keys %$test; 

... et vous auriez presque certainement mieux déplacer la génération HTML vers un template system séparé.

+0

+ 1 qui était presque ce que je cherchais – Thariama

4

Vous pouvez utiliser la fonction intégrée each:

while (my ($key, $value) = each %$test) { 
    print "key: $key, value: $value\n"; 
} 
+0

Ceci est ma façon préférée d'itérer sur un hachage . La construction 'foreach my ...' semble plus largement utilisée mais j'aime comment 'each' traite implicitement des paires clé/valeur. – Marcus

Questions connexes