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は、ハッシュへの参照を含む配列への参照を含むハッシュへの参照を保持しています。ええ、それは対処するためにかなり多くの入れ子です。さらに、外側のハッシュには値が1つしかないため、少し役に立たないようです。そうです、内側の配列に意味のある名前を付けると、間違いなく物事が明確になると思います。これは実際には「コピー」ではありません。コンテンツではなく、参照のみがコピーされます。次のすべてが同等です。

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}、指定されたのの要素key${$ref}{key}(または$$ref{key})です。中括弧には、参照を返す任意のコードを含めることができますが、短いバージョンは、スカラー変数がすでに参照を保持している場合にのみ使用できます。

ハッシュへの参照の配列が変数に含まれると、それを反復処理するのは次のように簡単です。

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

参照: http: //perldoc.perl.org/perlref.html

于 2012-08-28T18:29:03.923 に答える