2

XML の解析時に何か問題が発生しています。どういうわけか、2 つのループを繰り返す必要がありますが、必要なのは 1 つだけです。ここで何が間違っていますか?

最初に 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.
4

2 に答える 2

4

1 つの要素 (配列への参照) を持つ配列を作成するには、

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 )]オプションを使用して、魚が 1 匹しかいないときにコードが機能することを確認することを忘れないでください。

于 2013-02-26T08:13:16.250 に答える
0

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

于 2013-02-26T08:16:11.793 に答える