Buclă prin XML :: Structura simplă

Deci am un fisier xml ca acesta:

<?xml version="1.0" encoding="ISO-8859-1"?>

    
            
                    true
            
            
                    false
            
            
                    true
            
    

Vreau să trec prin toate setările folosind xml Simple.

Iată ce am când imprim imprimarea cu Data :: Dumper:

$VAR1 = {
      'settings' => {
                      'user' => 'anonymous',
                      's' => [
                               {
                                 'n' => 'blabla1',
                                 'v' => 'true'
                               },
                               {
                                 'n' => 'blabla2',
                                 'v' => 'false'
                               },
                               {
                                 'n' => 'blabla3',
                                 'v' => 'true'
                               }
                             ]
                    },
      'result' => '0'
    };

Și aici este codul meu

 $xml = new XML::Simple;
 $data = $xml->XMLin($file);
 foreach $s (keys %{ $data->{'settings'}->{'s'} }) {
  print "TEST: $s $data->{'settings'}->{'s'}->[$s]->{'n'} $data->{'settings'}->{'s'}->[$s]->{'v'}
\n"; }

Și se întoarce aceste două rânduri, fără a se rupe:

TEST: n blabla1 true
TEST: v blabla1 true

Am încercat, de asemenea, să fac așa ceva:

foreach $s (keys @{ $data->{'settings'}->{'s'} }) {

Fără succes:

Type of arg 1 to keys must be hash (not array dereference) 

Pot imprima:

$data->{'settings'}->{'s'}->[1]->{'n'} $data->{'settings'}->{'s'}->[1]->{'v'}

Pentru fiecare setare, dar nu le pot trece prin ele.

Cum pot proceda? ce fac greșit?

Mulțumesc mult!

0

1 răspunsuri

Observați parantezele pătrate din dump: există o matrice implicată.

for (@{ $data->{settings}{s} }) {
    print $_->{n}, ' ', $_->{v}, "\n";
}

Dacă nu doriți să hardcode n și v , executați doar tastele pe referința hash dereferențiată:

for my $s (@{ $data->{settings}{s} }) {
    print join(', ', map "$_ = $s->{$_}", keys %$s), "\n";
}
0
adăugat
Ah, am lăsat cuvântul "chei" atunci când am încercat să parsez @array.
adăugat autor David, sursa
Să presupunem că nu ați știut numele pentru cheile "n" și "v", ați tipări ambele chei "n" și "v", împreună cu valorile lor respective?
adăugat autor swl1020, sursa
Sunt un programator Perl foarte nou, așa că nu sunt sigur ce vă cer. Ceea ce am încercat să fac este de a modifica bucla de acest tip, astfel încât în ​​loc să imprime valorile N și V, se imprimă ceva de genul N = valuen V = Valuev, dar fără codare greu „N“ și „V“
adăugat autor swl1020, sursa
@ swl1020: Întrebați cum să executați cheile pe o referință de tip hash?
adăugat autor choroba, sursa
@ swl1020: Verificați actualizarea.
adăugat autor choroba, sursa