我正在尝试显示使用其他公司的API获取的对象数组中的数据,但是当我尝试使用foreach循环时出现错误。
我正在使用Dumper来显示数组中的所有内容。
print Dumper($object);
Dumper的部分输出:
'enable_dha_thresholds' => 'false', 'members' => [ bless( { 'ipv4addr' => '192.168.1.67', 'name' => 'name.something.com' }, 'Something::Network::Member' ), bless( { 'ipv4addr' => '192.168.1.68', 'name' => 'name.something.com' }, 'Something::Network::Member' ) ], 'comment' => 'This is a comment',
我正在尝试提取似乎是双数组的“成员”:
//this works
print $members->enable_dha_thresholds();
//this works
print $members[0][0]->ipv4addr;
//does not work
foreach my $member ($members[0]){
print "IP". $member->ipv4addr()."\n";
}
我收到此错误: 无法在./script.pl第12行的未填充引用上调用方法“ipv4addr”。
我不确定我是否完全理解Perl中的“祝福”和“不完整”,因为我不熟悉该语言。
答案 0 :(得分:8)
print $ members [0] [0] - > ipv4addr; //这个 作品
所以$ members [0]是一个数组引用。
你必须取消引用数组:
foreach my $member ( @{ $members[0] } ){
print "IP". $member->ipv4addr()."\n";
}
引用“未完成引用”的错误告诉您没有使用对象;而你提供的数组引用不一样:)
HTH, 保罗
答案 1 :(得分:5)
这是“数组引用”与“数组”的问题。 $members[0]
是一个数组引用; foreach
运算符使用数组(或列表,是迂腐的)。你会想说
foreach my $member ( @{$members[0]} ) { ...
迭代$members[0]
引用的元素。
语法很棘手,你可能会在这个过程中犯一些错误。有助于您加快速度的相关文档位于perlref
(或perlreftut
),perllol
以及perldsc
和perlobj
。
<小时/>
顺便说一下,“祝福”意味着引用“知道”它是什么类型的对象以及它应该查看什么包以查看它可以运行的方法。当你得到一个“未经证实的引用”警告或错误时,这通常意味着你传递的东西不是一个预期某个对象的对象 - 在这种情况下,
$members[0]
是你想要传递祝福的未经证实的引用参考$members[0][0]
,$members[0][1]
等