2011-02-23 46 views
6

我試圖從使用其他公司的API獲取的對象數組中顯示數據,但是當我嘗試使用foreach循環時出現錯誤。顯示來自對象數組的數據

我正在使用Dumper來顯示數組中的所有內容。從自卸車

print Dumper($object); 

部分輸出

 
'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中的「有福」與「無用」,因爲我是新手語言。

回答

8

print $members[0][0]->ipv4addr; //this works

so $ members [0]是一個數組引用。
你必須數組取消引用:

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

指的是「unblessed參考」的錯誤告訴你你不使用的對象;而你提供一個數組引用,這是不一樣的:)

HTH, 保羅

+0

謝謝,這就是我正在尋找的。 – arcdegree 2011-02-23 22:16:52

5

它的「數組引用」與「數組」的問題。 $members[0]是一個數組引用; foreach運算符與數組(或列表,迂腐)工作。你會想說

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

超過迭代元素$members[0]指。

語法非常棘手,您可能會在此過程中犯下更多的錯誤。有關的文檔可以幫助您瞭解速度:perlref(或perlreftut),perllol以及perldscperlobj


的方式「福地」,指的是參考「知道」是什麼樣的對象,什麼包,應該看在看到它可以運行什麼方法。當您收到「未引用的參考」警告或錯誤時,通常意味着您傳遞的東西不是預期對象的某個對象 - 在這種情況下,$members[0]是您希望通過祝福引用的未引用參考文件$members[0][0]$members[0][1]等。

+0

謝謝,效果很好。 – arcdegree 2011-02-23 22:14:14