2011-04-02 3 views
3

Je tente d'analyser la sortie MediaWiki's API avec format=yaml. Mon code YAML ressemble à:Comment effectuer une itération sur un tableau dans une structure de données imbriquée?

use YAML qw(Dump Bless Load); 
use YAML::LoadURI; 
use YAML::Tag; 
my $yaml_hash = LoadURI($wiki_url); 
my $id = $yaml_hash->{query}->{namespaces}->[0]; 
print $id; 

Ceci est bien beau, mais comment vous itérer sur la sortie YAML sans brute forcer? Ce serait une idée, mais évidemment cela ne marche pas.

my $id = $yaml_hash->{query}->{namespaces}-[*]->{id} 

C'est ce que le YAML output ressemble:

--- 
query: 
    namespaces: 
    - 
     id: -2 
     case: first-letter 
     '*': Media 
     canonical: Media 
    - 
     id: -1 
     case: first-letter 
     '*': Special 
     canonical: Special 
    - 
     id: 0 
     case: first-letter 
     '*': 
      content: 
    - 
     id: 1 
     case: first-letter 
     '*': Talk 
     subpages: 
     canonical: Talk 
    - 
     id: 2 
     case: first-letter 
     '*': User 
     subpages: 
     canonical: User 
    - 
     id: 3 
     case: first-letter 
     '*': User talk 
     subpages: 
     canonical: User talk 

Répondre

4

Est-ce que vous voulez? Note: Je ne l'ai pas testé:

Objectif: quelque chose "Comme" $yaml_hash->{query}->{namespaces}-[*]->{id} - à l'exception fonctionnelle

Essayez ceci:

my @ids = map { $_->{id} } @{$yaml_hash->{query}->{namespaces}} ; 

Cependant, une boucle est probablement plus claire à une beaucoup de gens.

my @ids; 
foreach my $ns (@{$yaml_hash->{query}->{namespaces}}){ push @ids, $ns->{id} } 

Remarque Je dirigeais sur la connaissance de la structure de données Perl général, rien de spécifique YAML.

On suppose que 'requête' et '' namespaces sont littéraux; Si ce sont des paramètres, vous devez forcer ceux qui ont des boucles for-in ou while supplémentaires. Pour l'itération des hachages, recherchez keys() et each() dans perldoc perlfunc.

+0

la fonction de la carte a fonctionné comme un champion, merci pour la réponse rapide! – kSiR

+0

super, bonne chance! – Paul

+0

Donc, seulement pour poursuivre mon auto-éducation sur Perl, est la fonction de carte fournissant le $ _ à l'absence de meilleurs termes "boucle interne" à l'intérieur de la carte en fonction de ce que la valeur de l'ID -> {query} -> { espaces de noms}? – kSiR

Questions connexes