2012-10-05 66 views
3

我有一個程序使用XML::Simple解析一些XML。它在某些時候出現在XML中有冗餘條目,它們被序列化,但我不能在我的生活中找出如何將這些數據作爲簡單字符串返回。這個XML的一個子集看起來像是被XML::Simple放入數組中。在運行Dumper($data)其中數據是我解析的XML時,相關小節如下。Perl Data :: Dumper散列在數組中?

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' 
     } 
    ]; 

所以在捕獲的陣列中看起來都是正確的。該數組似乎有一個元素,並且在該元素中有四個散列。這是我卡住的地方。我不知道如何讓這些哈希中的信息再次返回。我已經嘗試了大約40種不同的東西,我只是將我的頭撞在牆上。我很想將每個散列的值傳遞給一個簡單的本地數組(例如@samplingrate),其中我擁有所有這四個條目,並且可以通過$samplingrate[0]等簡單引用它們。

任何幫助將不勝感激。

+0

我很困惑,你永遠不要提@samplingrate在你的例子。我猜,但你在尋找$ samplingrate - > [0]? –

+0

如果你看看數據輸出,SamplingRate實際上是在數組內部的每個散列的內部(至少在我讀它的時候)。我使用SamplingRate作爲示例,但我希望能夠訪問任何數據值。 – szumlins

回答

6

我相信你的意思是要提領數組,像這樣:

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

或只使用一個數組引用,而不是

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

對於一些memorizable規則來處理引用和數據結構,看http://perlmonks.org?node=References+quick+reference

+0

這正是我正在尋找的。謝謝! – szumlins

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

你將不得不遍歷你的數組例如:使用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'}