2012-10-05 5 views
3

XML::Simple을 사용하여 XML을 구문 분석하는 프로그램이 있습니다. XML에 직렬화 된 중복 항목이있는 시점이 있습니다. 그러나 필자는이 데이터를 간단한 문자열로 다시 가져 오는 방법을 생각할 수 없습니다. XML::Simple에 의해 배열에 삽입 된 것으로 보이는이 XML의 하위 집합이 있습니다. 해당 하위 섹션은 데이터가 구문 분석 된 XML 인 Dumper($data)을 실행할 때 다음과 같습니다. 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};

I 출력이의 덤프, 나는 다음과 같은받을 때

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

그래서 모두 캡처 한 배열에서 올바르게 보입니다. 배열은 하나의 요소를 갖고 있으며, 그 내부에는 4 개의 해시가 있습니다. 이것은 내가 붙어있는 곳이다. 이 해시의 정보를 다시 얻는 방법을 모르겠습니다. 나는 약 40 가지를 시도해 봤는데 벽에 머리를 두드렸다. 나는이 중 네 개의 모든 항목을 갖고 있으며 간단하게 $samplingrate[0] 등을 참조 할 수있는 간단한 로컬 배열 (예 : @samplingrate과 같은)에 각 해시의 값을 전달하기 만하면됩니다.

Any 도움을 주시면 감사하겠습니다.

+0

내가 혼란 스러워요, 당신이 이제까지 당신의 예에서 @samplingrate 언급하지 않는 액세스 할 수있는 방법이다. 나는 추측하고 있지만, 당신은 $ samplingrate -> [0]을 찾고 있습니까? –

+0

데이터 출력을 살펴보면 SamplingRate는 실제로 어레이 내부에있는 각 해시 내부에 있습니다 (적어도 내가 읽었을 때). 예를 들어 SamplingRate를 사용했지만 데이터 값에 액세스 할 수 있기를 원합니다. – szumlins

답변

6

난 당신이, 배열을 역 참조과 같이 할 말은 생각 :

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

하거나 참조와 데이터 구조를 처리하는 일부 memorizable 규칙에 대한 arrayref 대신

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

를 사용, 참조 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'}