2012-08-28 104 views
4

一個哈希散列的數組我有哈希值的陣列中的哈希值是這樣的:迭代通過在Perl

$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} };所以我只有一個哈希數組?

回答

13

無需複製:

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

只是信息,如果你使用XML有你的哈希::簡單xmlin你必須使用'foreach my $ file(@ {$ filelist - > {file}})'' – AndyH

3

有在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