【问题标题】:Perl Data::Dumper hashes inside array?Perl Data::Dumper 在数组中散列?
【发布时间】:2012-10-05 04:22:37
【问题描述】:

我有一个使用XML::Simple 解析一些XML 的程序。在某些时候,XML 中似乎有多余的条目,这些条目会被序列化,但我一生都无法弄清楚如何将这些数据作为简单的字符串取回。这个 XML 的一个子集似乎被XML::Simple 放入一个数组中。运行 Dumper($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'
      }
    ];

所以在捕获的数组中似乎一切正常。该数组似乎有一个元素,并且在该元素内有四个散列。这就是我卡住的地方。我不知道如何将这些散列中的信息再次取出。我已经尝试了大约 40 种不同的东西,但我只是用头撞墙。我很想将每个散列的值传递给一个简单的本地数组(例如@samplingrate),其中我有所有这四个条目,并且可以通过$samplingrate[0]等简单地引用它们。

任何帮助将不胜感激。

【问题讨论】:

  • 我很困惑,你从来没有在你的例子中提到过@samplingrate。我猜,但你在寻找 $samplingrate->[0] 吗?
  • 如果您查看数据输出,SamplingRate 实际上位于数组内部的每个散列中(至少在我正在阅读的时候)。我以 SamplingRate 为例,但我希望能够访问任何数据值。

标签: arrays perl hash data-dumper


【解决方案1】:

我相信您的意思是取消对数组的引用,如下所示:

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

【讨论】:

  • 这正是我想要的。谢谢!
【解决方案2】:
my @audiostuff = $data->{ClipContent}->{EssenceList}->{Audio};

您将不得不遍历您的数组 ex:使用 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'} 

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多