2013-02-26 6 views
2

Я делаю что-то неправильно при анализе XML. Как-то я должен повторять два цикла, где нужно только одно. Что я здесь делаю неправильно?perl, разбор XML с использованием XML :: Simple

Сначала данные XML:

<fishy> 
    <fish displayName   = "Scalar" 
     description   = "the first fish I bought." 
    /> 
    <fish displayName   = "crystal red" 
     description   = "not really a fish." 
    /> 
</fishy> 

Тогда мой код Perl:

#!/usr/bin/perl -w 
use strict; 
use XML::Simple; 
use Data::Dumper; 

#Read configuration 
my $simple = XML::Simple->new(); 
my $data = $simple->XMLin('test.xml'); 
print Dumper($data) . "\n"; 


my @fishes = $data->{fish}; 

#This is weird.. Why do we have nested arrays? 
foreach my $fish (@fishes) 
{ 
    foreach my $innerFish (@{$fish}) 
    { 
    print ("\n" . $innerFish->{displayName} . " is " . $innerFish->{description}); 
    } 
    print ("\n"); 
} 

И, наконец, ответ (это хорошо)

$VAR1 = { 
      'fish' => [ 
        { 
         'description' => 'the first fish I bought.', 
         'displayName' => 'Scalar' 
        }, 
        { 
         'description' => 'not really a fish.', 
         'displayName' => 'crystal red' 
        } 
        ] 
     }; 


Scalar is the first fish I bought. 
crystal red is not really a fish. 
+0

Что произойдет, если вы обойдетесь? –

ответ

4

Вы создаете массив с одним элемент (ссылка на массив) с

my @fishes = $data->{fish}; 

Тогда вы итерацию по элементам этого массива с

foreach my $fish (@fishes) 

Это просто действительно странно способ сделать

my $fish = $data->{fish}; 

Давайте использовать, но переименовать $fish в $fishes и $innerFish к $fish.

my $fishes = $data->{fish}; 
for my $fish (@$fishes) { 
    print($fish->{displayName}, " is ", $fish->{description}, "\n"); 
} 

Не забудьте использовать опцию ForceArray => [qw(fish)], чтобы убедиться, что код работает, когда у вас есть только один рыбы.

+0

Спасибо ikegami – daljian

0

my @fishes = @{$data->{fish}};

+1

ug, ненужная копия массива. Это полная трата. – ikegami

Смежные вопросы