2012-04-30 38 views
4

我要hases的數組,我傳遞給一個子程序在我的perl腳本參考如何遍歷Perl中對哈希數組的引用?

這是代碼:

sub mySub { 
    (my $resultref) = @_; 
    my @list = @$resultref; 
    print Dumper(@list); 
    foreach my $result (@list) { 
     print Dumper($result); 
    } 
} 

這是輸出:

$VAR1 = [ 
      { 
      'portName' => '1.1', 
      'ips' => [ 
         '192.168.1.242' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         '00:16:76:9e:63:47' 
         ] 
      }, 
      { 
      'portName' => '1.10', 
      'ips' => [ 
         '192.168.1.119', 
         '192.168.1.3' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         'd0:67:e5:f8:7e:7e', 
         'd0:67:e5:f8:7e:76' 
         ] 
      }, 
     ]; 

$VAR1 = [ 
      { 
      'portName' => '1.1', 
      'ips' => [ 
         '192.168.1.242' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         '00:16:76:9e:63:47' 
         ] 
      }, 
      { 
      'portName' => '1.10', 
      'ips' => [ 
         '192.168.1.119', 
         '192.168.1.3' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         'd0:67:e5:f8:7e:7e', 
         'd0:67:e5:f8:7e:76' 
         ] 
      }, 
     ]; 

循環將整個數組放入$ result變量中。我曾嘗試將它作爲@ $ result [0]解除引用,但沒有成功。

我該如何循環這些散列?

謝謝!

回答

5

的參數Data::DumperDumper功能應該是引用。例如: -

use Data::Dumper; 
my @array = ([1,2,3], [11,22,33]); # Two-dimensional array 
print Dumper @array;    # print array 
print Dumper \@array;    # print reference to array 

輸出:

$VAR1 = [ 
      1, 
      2, 
      3 
     ]; 
$VAR2 = [ 
      11, 
      22, 
      33 
     ]; 

$VAR1 = [ 
      [ 
      1, 
      2, 
      3 
      ], 
      [ 
      11, 
      22, 
      33 
      ] 
     ]; 

第二打印爲我們提供了一個變量整個結構。當您直接打印的陣列,它擴展到它的所有元素,所以...

print Dumper @array; 

等同於:

print Dumper $array[0], $array[1], ..., $array[$#array]; 

所以,你的情況,只是做:

sub mySub { 
    my ($resultref) = @_; 
    print Dumper $resultref; 
} 

訪問內部變量:

只要看看Data::Dumper的輸出:

$VAR1 = [ # bracket denotes start of an array ref 
      { # curly brackets = hash ref 
      'portName' => '1.1', 
      'ips' => [ 
         '192.168.1.242' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         '00:16:76:9e:63:47' 
         ] 
      }, # hash ref ends, comma = new array element begins 
      { # new hash ref 
      'portName' => '1.10', 
      'ips' => [ 
         '192.168.1.119', 
         '192.168.1.3' 
        ], 
      'switchIp' => '192.168.1.20', 
      'macs' => [ 
         'd0:67:e5:f8:7e:7e', 
         'd0:67:e5:f8:7e:76' 
         ] 
      }, # end of hash 
     ]; # end of array 

重要,這裏要注意的是,陣列的所有元件,並且一個散列的所有值是標量。因此,所有的哈希和數組可以很容易地分解爲一個標量列表。

for my $aref (@$resultref) { # starting array ref 
    for my $aref2 (@$aref) { # second level array ref 
     for my $href (@$aref2) # here begins the hash 
      local $\ = "\n"; # add newline to print for simplicity 
      print $href->{portName}; # printing a scalar 
      print for @{$href_>{ips}}; # printing an array ref w post-script loop 
      print $href->{switchIp}; 
      print for @{$href->{macs}}; 
     } 
    } 
} 

請注意使用箭頭運算符來取消引用引用。如果你有一個散列或數組,你可以使用$array[0]$hash{$key},但是通過使用引用,你可以指向引用中包含的地址:$array->[0]$hash->{$key}

+0

謝謝,解釋是非常有幫助和完整 – Joon

+0

@Joon不客氣。 – TLP

1

我不得不hases

不,你在參考已經傳遞到數組引用到散列數組的數組的引用。

如果您刪除了外部級別的間接尋址,那麼您的代碼將按需要工作。

3

傳遞給mySub的參數是對arrayrefs數組的引用。遍歷嵌套的數組,你可以這樣做:

sub mySub { 
    my ($resultref) = @_; 
    for my $result (@$resultref) { 
     my @list = @$result; # array of hashrefs 
     ... 
    }   
}