Perl中的无法参考

Ωme*_*ega 0 methods perl reference

我有一个使用模式的Perl应用程序WWW::Scripter.它解析了非常庞大的代码,并且所有工作都很棒,只有一个问题发生,我无法理解.

我收到了错误

无法在/usr/lib/perl5/site_perl/5.8.8/JE.pm行的未填充引用上调用方法"addEventListener"...

它看起来像JE.pm(JavaScript引擎)中的错误,似乎是稳定的.这个JE被称为WWW::Scripter,这似乎也是稳定的模块.

跟踪JavaScript源我意识到,有时(并不总是)这样的错误发生在JavaScript的以下部分:

var addEvent=(function(){if(document.addEventListener){...
Run Code Online (Sandbox Code Playgroud)

这似乎也是正确的.

让我们来看看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(@_) },
        );
Run Code Online (Sandbox Code Playgroud)

和"线",这种错误发生在它的底部,所以>>

            : $unwrap
              ? sub { shift->value->$m(
                $self->_unwrap(@_)) }
              : sub { shift->value->$m(@_) },
Run Code Online (Sandbox Code Playgroud)

那有什么不对?在这种情况下,什么错误未完成引用意味着什么?

Wes*_*ker 11

一个未经证实的引用是一个变量不是对象的合法引用,但是你试图在它上面调用一个函数就好像它是一个合法的对象.

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

$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";
Run Code Online (Sandbox Code Playgroud)

运行以上将产生:

hello world
about to crash
Can't call method "afunction" on unblessed reference at test.pl line 21.
Run Code Online (Sandbox Code Playgroud)

现在,为什么上面的代码导致了一个无法解决的对象,你必须做更多的调试才能发现.