6

他社APIで取得したオブジェクトの配列からデータを表示したいのですが、foreachループをしようとするとエラーになります。

配列内のすべてを表示するために Dumper を使用しています。

print Dumper($object);

ダンパーからの部分的な出力:

'enable_dha_thresholds' => 'false',
  'メンバー' => [
    祝福( {
      'ipv4addr' => '192.168.1.67',
      '名前' => 'name.something.com'
    }, '何か::ネットワーク::メンバー' ),
    祝福( {
      'ipv4addr' => '192.168.1.68',
      '名前' => 'name.something.com'
    }, '何か::ネットワーク::メンバー' )
  ]、
  'comment' => 'これはコメントです',

double 配列のように見える「メンバー」を抽出しようとしています。

//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 line 12.

私は Perl を初めて使用するので、Perl の「祝福された」と「祝福されていない」を完全に理解しているかどうかはわかりません。

4

2 に答える 2

8

print $members[0][0]->ipv4addr; //これは機能します

$members[0] は配列リファレンスです。
配列を逆参照する必要があります。

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

「祝福されていない参照」を参照するエラーは、オブジェクトを使用していないことを示しています。むしろ、同じではない配列参照を提供します:)

HTH、ポール

于 2011-02-23T22:08:19.963 に答える
5

「配列参照」と「配列」の問題です。$members[0]配列参照です。演算子はforeach、配列 (または、ペダンティックにするためにリスト) を操作します。あなたは言いたくなるでしょう

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

参照する要素を反復処理し$members[0]ます。

構文はトリッキーで、途中でさらにいくつかの間違いを犯す可能性があります。理解を深めるための関連ドキュメントは、perlref(またはperlreftut)、perllol、および にperldscありperlobjます。


ちなみに、「祝福された」とは、参照が、それがどのような種類のオブジェクトであり、実行できるメソッドを確認するためにどのパッケージを調べる必要があるかを「知っている」ことを意味します。「祝福されていない参照」の警告またはエラーが発生した場合、それは通常、オブジェクトを予期していた場所にオブジェクトではないものを渡したことを意味します。この場合$members[0]は、祝福された参照を渡すつもりでしたが、祝福されていない参照$members[0][0]です$members[0][1]

于 2011-02-23T22:08:50.010 に答える