Разве это не ссылка на массив? Почему это не ссылка на массив?

Я пытаюсь отладить загадочную проблему с помощью следующих строк, глубоко в духе программы, которую я унаследовал,

my $log = [];
$root->validate_subtree($log); 

приводит к следующей ошибке

Treex::PML::Node::validate: журнал должен быть ссылкой на массив

$root является объектом типа Treex::PML::Nodeи две линии действительно смежны - я ничего не пропустил. Я пошел к источнику сообщения об ошибке, иvalidate_subtree() проверяет свой аргумент следующим образом (строка 423 Node.pm):

sub validate_subtree {
  my ($node, $log) = @_;
  if (defined $log and UNIVERSAL::isa($log,'ARRAY')) {
    croak __PACKAGE__."::validate: log must be an ARRAY reference";
  }

я думал так $log = [] действительно инициализирует $log на ссылку на массив! Что мне не хватает?

1 ответ

Решение

Ты прав. Код, который вы показали, устанавливает $log к ссылке на массив. Этот код:

sub validate_subtree {
  my ($node, $log) = @_;
  if (defined $log and UNIVERSAL::isa($log,'ARRAY')) {
    croak __PACKAGE__."::validate: log must be an ARRAY reference";
  }

хрипит именно тогда, когда $log на самом деле ссылка на массив. Я думаю, вы нашли ошибку в дистрибутиве, и это должно быть

  if (defined $log and not UNIVERSAL::isa($log,'ARRAY')) {
Другие вопросы по тегам