2010-11-23 16 views
1

J'utilise XML::Simple en Perl pour analyser dans un fichier XML et je suis coincé sur la façon de construire une boucle pour parcourir tous les éléments possibles de un tableau dans le hachage.besoin de construire une foreach à partir d'un tableau de hachage d'éléments variables en Perl

Voici comment imprimer l'élément 0e du tableau:

print $book_info->{BookList}->{BookData}->{Prices}->{Price}[0]->{is_new}; 

Ma terminologie pourrait être lorsque vous utilisez les mots par rapport à hacher tableau, mais je suis en train de boucler à travers tous les éléments à l'intérieur {Price}[$ref]

J'ai essayé:

my @refs = $book_info->{BookList}->{BookData}->{Prices}->{Price}; 
foreach(@refs) 
{ 
    print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$_]->{store_id}; 
    print "\n"; 
} 


et

foreach my $key (keys (%{$book_info->{BookList}->{BookData}->{Prices}->{Price}})) 
{ 
    print $key."\n"; 
} 


Cette instruction d'impression suivante retourne une valeur de "ARRAY(0x159a57c)"

print [$book_info->{BookList}->{BookData}->{Prices}->{Price}]; 


Cela fonctionne pour le foreach, mais je ne peux pas accéder correctement les éléments:

foreach (@{$book_info->{BookList}->{BookData}->{Prices}->{Price}}) 
{ 
    print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$_]; #this line is wrong 
} 

Des suggestions? Il y a plusieurs éléments {Price} dans l'élément {Prices}, et chaque élément {Price} a [x] attributs dans le XML.

+0

Je ne l'ai pas utilisé XML :: Simple, mais je présume que 'book_info $ -> {Booklist} -> {BookData} -> {prix} -> {Prix}' est référence à un tableau, vous aurez donc besoin pour le déréférencer comme ceci '@ ($ book_info -> {BookList} -> {BookData} -> {Prices} -> {Price})'. Incluez également la sortie que vous obtenez maintenant de votre script. –

+0

j'ai essayé 'foreach (@ (book_info $ -> {Booklist} -> {BookData} -> {Prix} -> {Prix}))' et 'a Scalar trouvé où l'opérateur prévu .....' – CheeseConQueso

+1

Prenez une regardez [perldoc perlreftut] (http://perldoc.perl.org/perlreftut.html) et [perldoc perldsc] (http://perldoc.perl.org/perldsc.html). – Ether

Répondre

3

Les gens aren ». t tout à fait l'obtenir pour vous si je vous comprends bien, vous voulez.

foreach my $element (@{ $book_info->{BookList}->{BookData}->{Prices}->{Price} }) { 
    print $element->{store_id}; 
    print "\n"; 
} 

conseils utiles pour faire face aux structures de données imbriquées se trouve à http://perlmonks.org/?node=References+quick+reference

+0

j'ai essayé la même chose, mais je veux obtenir à ces éléments: 'imprimer $ book_info -> {BookList} -> {BookData} -> {Prix} -> {Price} [$ element];' regarder ce site maintenant – CheeseConQueso

+0

'imprimer $ book_info -> {BookList} -> {BookData} -> {Prix} -> {Price} [$ element] -> {store_id};' – CheeseConQueso

+0

# 4 du site: '$ {$ hRef- > {KEY}} [1] $ hRef -> {KEY} -> [1] $ hRef -> {KEY} [1] 'ressemble le plus à ma situation, mais je ne sais pas comment ça pourrait rentrer – CheeseConQueso

0

Avez-vous essayé vider le contenu de $ book_info Dumper de données (données d'utilisation :: Dumper;? Imprimer Dumper (de book_info de $) Il devrait vous donner une idée sur la façon de procéder

+0

Peut-être que vous pourriez poster une sortie ici afin que nous puissions jeter un coup d'oeil. – hartem

2

extension Marginalement la réponse de » ysth:

foreach my $elem_ref (@{$book_info->{BookList}->{BookData}->{Prices}->{Price}}) 
{ 
    foreach my $key (sort keys %{$elem_ref}) 
    { 
     print $elem_ref->{$key}; 
    } 
    print "\n"; 
} 

En partie, cela utilise la recommandation de Perl meilleures pratiques pour désigner les références avec le suffixe _ref.