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::Dumper函数的参数Dumper应该是引用。例如:

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's 的输出:

$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]or $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 回答