我有一个使用模式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(@_) },
那有什么不对?在这种情况下,错误未完成引用的确切含义是什么?
答案 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.
现在,为什么上面的代码导致了一个无法解决的对象,你必须做更多的调试才能发现。