8

我在哈希中有一个哈希数组,如下所示:

$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} };所以我只有一个哈希数组?

4

2 回答 2

22

无需复制:

foreach my $file (@{ $filelist{file} }) {
  print "path: $file->{pathname}; size: $file->{size}; ...\n";
}
于 2012-08-28T08:44:33.290 回答
4

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

请注意,当使用 sigil{ref} 语法时,sigil 遵循与往常相同的规则:%{$ref}(or %$ref) 是 $ref 引用的哈希,但%{$ref}给定的元素key${$ref}{key}(or $$ref{key})。大括号可以包含返回引用的任意代码,而短版本只能在标量变量已经持有引用时使用。

一旦您对哈希的引用数组位于变量中,迭代它就像:

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

见: http: //perldoc.perl.org/perlref.html

于 2012-08-28T18:29:03.923 回答