Perl中的无法参考

时间:2012-03-14 21:13:57

标签: perl methods reference

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

我收到错误

无法在未完成的引用上调用方法“addEventListener”       在/usr/lib/perl5/site_perl/5.8.8/JE.pm line ...

JE.pm(JavaScript引擎)中的错误似乎是稳定的。这个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(@_) },
        );

和“line”,其中发生此类错误的是其底部,因此>>

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

那有什么不对?在这种情况下,错误未完成引用的确切含义是什么?

1 个答案:

答案 0 :(得分:10)

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

# 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.

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