4

perl スクリプトのサブルーチンに渡す hases の配列への参照があります。

これはコードです:

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] として逆参照しようとしましたが、成功しませんでした。

これらのハッシュを個別にループするにはどうすればよいですか?

ありがとう!

4

3 に答える 3

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
          ]
        ];

2 番目の出力では、構造全体が 1 つの変数に含まれています。配列を直接印刷すると、すべての要素に展開されるため...

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]orを実行しますが$hash{$key}、参照を使用することで、代わりに参照に含まれるアドレスを「ポイント」します:$array->[0]または$hash->{$key}.

于 2012-04-30T12:16:51.750 に答える
3

に渡されるパラメーターmySubは、arrayrefs の配列への参照です。ネストされた配列を反復処理するには、次のようにします。

sub mySub {
    my ($resultref) = @_;
    for my $result (@$resultref) {
        my @list = @$result; # array of hashrefs
        ...
    }        
}
于 2012-04-30T11:13:31.267 に答える
1

hases の配列への参照があります

いいえ、ハッシュの配列への参照の配列への参照を渡しました。

その外部レベルの間接性を取り除くと、コードは期待どおりに機能します。

于 2012-04-30T11:10:10.407 に答える