Отображать данные из массива объектов - PullRequest
6 голосов
/ 24 февраля 2011

Я пытаюсь отобразить данные из массива объектов, полученных с помощью 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";  
}

Я получаю эту ошибку: Невозможно вызвать метод "ipv4addr" для неподтвержденной ссылки в строке 12Perl, так как я новичок в этом языке.

Ответы [ 2 ]

8 голосов
/ 24 февраля 2011

print $ members [0] [0] -> ipv4addr; //этот работает

поэтому $ members [0] является ссылкой на массив.
Вы должны разыменовать массив:

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

Ошибка ссылки на «необъявленную ссылку» говорит о том, что вы не используете объект; скорее вы предоставляете ссылку на массив, которая не совпадает:)

НТН, Пол

5 голосов
/ 24 февраля 2011

Это проблема «ссылка на массив» против «массив». $members[0] - ссылка на массив; оператор foreach работает с массивами (или списками, чтобы быть педантичными). Вы хотите сказать

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

для перебора элементов, на которые ссылается $members[0].

Синтаксис хитрый, и вы, вероятно, сделаете еще несколько ошибок с этим материалом. Соответствующие документы, которые помогут вам набрать скорость: perlref (или perlreftut), perllol, а также perldsc и perlobj.


Кстати, «благословенный» означает, что ссылка «знает», что это за объект и в каком пакете он должен посмотреть, какие методы он может запустить. Когда вы получаете предупреждение или ошибку «unblessed reference», это обычно означает, что вы передали что-то, что не было объектом где-то, что ожидало объект - в этом случае $members[0] является необъявленной ссылкой, в то время как вы намеревались передать благословенные ссылки $members[0][0], $members[0][1] и т. Д.

...