通过哈希值的阵列在Perl遍历一个哈希表(Iterate through Array of Hash

2019-06-27 11:51发布

我有一个哈希看起来像这样的哈希值的数组:

$VAR1 = {
          'file' => [
                      {
                        'pathname' => './out.log',
                        'size' => '51',
                        'name' => 'out.log',
                        'time' => '1345799296'
                      },
                      {
                        'pathname' => './test.pl',
                        'size' => '2431',
                        'name' => 'test.pl',
                        'time' => '1346080709'
                      },
                      {
                        'pathname' => './foo/bat.txt',
                        'size' => '24',
                        'name' => 'bat.txt',
                        'time' => '1345708287'
                      },
                      {
                        'pathname' => './foo/out.log',
                        'size' => '75',
                        'name' => 'out.log',
                        'time' => '1346063384'
                      }
                    ]
        };

我怎样才能在一个循环中,这些“文件条目”迭代,并访问其价值? 它是更容易复制my @array = @{ $filelist{file} }; 所以我只有散列数组?

Answer 1:

无需复制:

foreach my $file (@{ $filelist{file} }) {
  print "path: $file->{pathname}; size: $file->{size}; ...\n";
}


Answer 2:

有在Perl没有散列的数组,只标量的数组。 它只是碰巧有一个在情况下一堆语法糖的标量是数组或散列引用。

在例如,$ VAR1保持到含有含到散列的引用数组的引用一个散列的引用。 是啊,这是相当多的嵌套来处理。 另外,外散,似乎有点没用的,因为它仅包含一个值。 所以,是的,我想给内部数组一个有意义的名字肯定会令事情更清晰。 这实际上不是“复制”:仅引用复制,而不是内容。 以下所有的是等价的:

my @files = $VAR1 -> {file} # dereferencing with the -> operator
my @files = ${$VAR1}{file}  # derefencing with the sigil{ref} syntax
my @files = $$VAR1{file}    # same as above with syntactic sugar

注意,使用印记{REF}语法的情况下,印记服从相同的规则照例: %{$ref}%$ref )是$ REF引用的散列,但是该元件%{$ref}为一给定的key${$ref}{key} (或$$ref{key} )。 大括号可以包含返回参考任意代码,而当一个标量变量已经持有的基准短版本只能用。

一旦你对散列引用的数组是一个变量,迭代是一样简单:

for (@files) {
    my %file = %$_;
    # do stuff with %file
}

请参阅: http://perldoc.perl.org/perlref.html



文章来源: Iterate through Array of Hashes in a Hash in Perl