6

我正在尝试显示使用另一家公司的 API 获得的对象数组中的数据,但是当我尝试使用 foreach 循环时出现错误。

我正在使用 Dumper 显示数组中的所有内容。

print Dumper($object);

Dumper 的部分输出:

'enable_dha_thresholds' => '假',
  '成员' => [
    祝福({
      'ipv4addr' => '192.168.1.67',
      'name' => 'name.something.com'
    }, 'Something::Network::Member' ),
    祝福({
      'ipv4addr' => '192.168.1.68',
      'name' => 'name.something.com'
    }, 'Something::Network::Member' )
  ],
  '评论' => '这是评论',

我正在尝试提取似乎是双数组的“成员”:

//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";  
}

我收到此错误:Can't call method "ipv4addr" on unblessed reference at ./script.pl 第 12 行。

我不确定我是否完全理解 Perl 中的“blessed”与“unblessed”,因为我是该语言的新手。

4

2 回答 2

8

打印 $members[0][0]->ipv4addr; //这有效

所以 $members[0] 是一个数组引用。
您必须取消引用数组:

foreach my $member ( @{ $members[0] } ){
    print "IP". $member->ipv4addr()."\n";  
}

引用“unblessed reference”的错误告诉您您没有使用对象;而是您提供一个数组引用,这不一样:)

HTH,保罗

于 2011-02-23T22:08:19.963 回答
5

这是“数组引用”与“数组”的问题。$members[0]是一个数组引用;运算符foreach使用数组(或列表,是迂腐的)。你会想说

foreach my $member ( @{$members[0]} ) { ...

迭代$members[0]引用的元素。

语法很棘手,你可能会在使用这些东西的过程中犯更多错误。帮助您快速了解的相关文档位于perlref(或perlreftut)、、perllol以及perldscperlobj


顺便说一句,“祝福”意味着引用“知道”它是什么类型的对象以及它应该查看什么包以查看它可以运行哪些方法。当您收到“unblessed reference”警告或错误时,这通常意味着您在某个期望对象的地方传递了不是对象的东西——在这种情况下,$members[0]是 unblessed 引用,而您打算传递祝福的引用$members[0][0],$members[0][1]等。

于 2011-02-23T22:08:50.010 回答