Несобственная ссылка в Perl - PullRequest
0 голосов
/ 15 марта 2012

У меня есть приложение Perl, которое использует режим WWW::Scripter.Он анализирует очень большие коды и все прекрасно работает, возникает только одна проблема, которую я не могу понять.

Я получаю сообщение об ошибке

Невозможно вызвать метод "addEventListener" для необоснованной ссылки/usr/lib/perl5/site_perl/5.8.8/JE.pm line ...

Это похоже на ошибку в JE.pm (JavaScript Engine), которая кажется стабильной.Этот JE вызывается из WWW::Scripter, который также является стабильным модулем.

Отслеживание исходного кода JavaScript Я понял, что такая ошибка иногда (не всегда) возникает в следующей части JavaScript:

var addEvent=(function(){if(document.addEventListener){...

, что также кажется правильным.

Давайте посмотрим на раздел JE.pm, где происходит ошибка >>

        my ($method, $type) = _split_meth $m;

        $proto->new_method(
          $name => defined $type
            ? $unwrap
              ? sub {
                $self->_cast(
                  scalar shift->value->$method(
                    $self->_unwrap(@_)),
                  $type
                );
              }
              : sub {
                $self->_cast(
                  scalar shift->value->$method(@_),
                  $type
                );
              }
            : $unwrap
              ? sub { shift->value->$m(
                $self->_unwrap(@_)) }
              : sub { shift->value->$m(@_) },
        );

и "строка"где возникает такая ошибка - это ее нижняя часть, поэтому >>

            : $unwrap
              ? sub { shift->value->$m(
                $self->_unwrap(@_)) }
              : sub { shift->value->$m(@_) },

Так что же не так?Что именно означает ошибка нецензурная ссылка в данном случае?

1 Ответ

10 голосов
/ 15 марта 2012

Необязательная ссылка - это та, в которой одна переменная не является допустимой ссылкой на объект, но вы пытаетесь вызвать для нее функцию, как если бы это был допустимый объект.

# perl -e '$x = {}; $x->blue();'
Can't call method "blue" on unblessed reference at -e line 1.

Этовероятно, что $m в вышеприведенном тексте является именем функции addEventListener, но shift->value не возвращает правильный объект, который был "благословлен".Это способ указать, из каких package функций следует вызывать внутри.Вот пример кода:

package Foo;

sub afunction {
    print "hello world\n";
}

package main;

my $obj = {};
bless $obj, "Foo";    # $obj is now a "Foo"
my $m = "afunction";

$obj->$m();


my $obj = {};
my $m = "afunction";

# this will crash, because we didn't bless it this time
print "about to crash\n";
$obj->$m();
print "we won't get here\n";

И выполнение вышеприведенного кода даст:

hello world
about to crash
Can't call method "afunction" on unblessed reference at test.pl line 21.

Теперь, почему ваш приведенный выше код приводит к необъявленному объекту, вам придется делать намного большеотладка для обнаружения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...