我有一个关于我在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]但没有成功。
如何单独循环这些哈希?
谢谢!
答案 0 :(得分:5)
Data::Dumper的Dumper
函数的参数应该是引用。 E.g:
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]
或{{1 }}
答案 1 :(得分:3)
传递给mySub
的参数是对arrayrefs数组的引用。要迭代嵌套数组,您可以这样做:
sub mySub {
my ($resultref) = @_;
for my $result (@$resultref) {
my @list = @$result; # array of hashrefs
...
}
}
答案 2 :(得分:1)
我引用了一系列仇恨
不,您已将引用数组的引用传递给哈希数组。
如果删除了间接的外层,那么您的代码将按照需要运行。