【问题标题】:Iterating Through Array Of Hash References In Perl?遍历Perl中的哈希引用数组?
【发布时间】:2019-01-29 22:59:41
【问题描述】:

我正在使用 XML::Simple 将一些 XML 加载到基本上包含文件/目录信息的数据结构中。我遇到的问题是遍历生成的数据结构。我可以通过以下方式获取我需要的数据:

$lsResults->{file} 

如果我使用 Dumper 转储该结构,我看到的内容类似于:

$VAR1 = [
          {
            'owner' => 'reps_hd',
            'replication' => '3',
            'blocksize' => '134217728',
            'permission' => '-rw-r-----',
            'path' => '/projects/mdataeng/feeds/customer_care/mail_q_grid_data_20110816.dat',
            'modified' => '2011-08-18T21:41:11+0000',
            'size' => '625182',
            'group' => 'mdataeng',
            'accesstime' => '2011-08-18T21:41:11+0000'
          },
          {
            'owner' => 'reps_hd',
            'replication' => '3',
            'blocksize' => '134217728',
            'permission' => '-rw-r--r--',
            'path' => '/projects/mdataeng/feeds/customer_care/mail_q_grid_data_20110817.dat',
            'modified' => '2011-08-19T23:29:06+0000',
            'size' => '600199',
            'group' => 'mdataeng',
            'accesstime' => '2011-08-19T23:29:06+0000'
          }, 
   ....

这基本上不是一个哈希引用数组吗?我知道我可以通过以下方式引用第一个元素中的数据:

print Dumper($lsResults->{file}[0]);

$VAR1 = {
          'owner' => 'reps_hd',
          'replication' => '3',
          'blocksize' => '134217728',
          'permission' => '-rw-r-----',
          'path' => '/projects/mdataeng/feeds/customer_care/mail_q_grid_data_20110816.dat',
          'modified' => '2011-08-18T21:41:11+0000',
          'size' => '625182',
          'group' => 'mdataeng',
          'accesstime' => '2011-08-18T21:41:11+0000'
        };

所以,问题是,我如何遍历 $lsResults->{file} 结构中的所有结果来获取每个条目的“路径”键值?我知道我可以通过执行以下操作手动引用它:

print $lsResults->{file}[0]->{path};
print $lsResults->{file}[1]->{path};
print $lsResults->{file}[2]->{path};
print $lsResults->{file}[3]->{path};

但我似乎无法弄清楚如何迭代

$lsResults->{file}

我到底做错了什么?

【问题讨论】:

    标签: perl


    【解决方案1】:

    试试这个:

    for my $file ( @{$lsResults->{file}} ) {
        print $file->{path};
    }
    

    变量$lsResults->{file}实际上是一个数组引用,而不是数组,所以你必须取消引用它才能用for循环遍历它。

    【讨论】:

      【解决方案2】:

      您也可以使用map 来获取列表转换:

      use strict;
      use warnings;
      
      my @allPaths = map {$_->{path}} @{$lsResults->{file}}
      
      print "$_\n" foreach @allPaths;
      

      【讨论】:

        猜你喜欢
        • 2012-08-22
        • 2013-11-10
        • 2019-01-13
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 2013-02-09
        相关资源
        最近更新 更多