3

を使用してXMLを解析するプログラムがありますXML::Simple。ある時点で、XMLにはシリアル化される冗長なエントリが含まれているように見えますが、そのデータを単純な文字列として戻す方法を私は一生理解できません。このXMLのサブセットがあり、によって配列に入れられているように見えますXML::SimpleDumper($data)ここでデータが解析されたXMLである場合、関連するサブセクションは次のとおりです。

Audio = [
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      }
    ];

XMLで解析された出力の小さなサブセットを次のような変数に渡します。

my @audiostuff = $data->{ClipContent}->{EssenceList}->{Audio};

これのダンプを出力すると、次のようになります。

$VAR1 = [
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      },
      {
        'AudioIndex' => {
                        'StartByteOffset' => '32768',
                        'DataSize' => '3071872'
                      },
        'SamplingRate' => '48000',
        'BitsPerSample' => '16',
        'AudioFormat' => 'MXF'
      }
    ];

したがって、キャプチャされたアレイではすべてが正しいように見えます。配列には1つの要素があるように見え、その1つの要素の中に4つのハッシュがあります。これは私が立ち往生しているところです。これらのハッシュの情報を再び取得する方法がわかりません。私は約40の異なることを試しましたが、壁に頭をぶつけているだけです。各ハッシュの値を単純なローカル配列(たとえば、次のようなもの)に渡すだけで、これらの4つのエントリすべてが含まれ、などで@samplingrate簡単に参照できるようにしたいと思います。$samplingrate[0]

どんな助けでもいただければ幸いです。

4

2 に答える 2

6

次のように、配列を逆参照することを意味していると思います。

my @audiostuff = @{ $data->{ClipContent}->{EssenceList}->{Audio} };
# do stuff with $audiostuff[0], etc.

または、代わりにarrayrefを使用してください

my $audiostuff = $data->{ClipContent}->{EssenceList}->{Audio};
# do stuff with $audiostuff->[0], etc.

参照とデータ構造を処理するためのいくつかの覚えやすいルールについては、http://perlmonks.org?node = References + quick+referenceを参照してください。

于 2012-10-05T06:18:16.093 に答える
1
my @audiostuff = $data->{ClipContent}->{EssenceList}->{Audio};

配列をループする必要があります。例:using for

以下はそれにアクセスする方法です

    $audiostuff[0]->{'AudioIndex'}  # This will give you hashref

     # Below will give you value 32768, Similarly you can get value for 'DataSize' 

    $audiostuff[0]->{'AudioIndex'}->{'StartByteOffset'} 

    # To access other elements/values.

     $audiostuff[0]->{'SamplingRate'}

     $audiostuff[0]->{'BitsPerSample'}

     $audiostuff[0]->{'AudioFormat'} 

     # How it works is,

    $audiostuff[0] # is first element of array, 

    $audiostuff[0]->{'AudioIndex'} # -> is used because element we get 
above is hash reference and then we get value at key 'AudioIndex'.

     # Similarly for 

$audiostuff[0]->{'AudioIndex'}->{'StartByteOffset'} 
于 2012-10-05T07:32:27.373 に答える