2012-04-30 1 views
4

私は私のperlスクリプトにサブルーチンに渡すhasesの配列への参照を持っている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; 
} 

内部変数へのアクセス:

ちょうど0を見てくださいの出力:

$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 
     ... 
    }   
} 
関連する問題