在Perl中的哈希中迭代哈希数组

时间:2012-08-28 08:40:34

标签: arrays perl loops hash

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

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

2 个答案:

答案 0 :(得分:14)

无需复制:

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

答案 1 :(得分: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}(或%$ref)是$ ref引用的哈希值,但%{$ref}的元素1}}对于给定的key${$ref}{key}(或$$ref{key})。大括号可以包含返回引用的任意代码,而短版本只能在标量变量已经存在引用时使用。

一旦你的哈希引用数组在一个变量中,迭代就好了:

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

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