Ωmega Ωmega - 4 years ago 211
Perl Question

Unblessed reference in Perl

I have a Perl application that use mode

WWW::Scripter
. It parse very huge codes and all works great, just one problem occurs that I cannot understand.

I am getting error

Can't call method "addEventListener" on unblessed reference
at /usr/lib/perl5/site_perl/5.8.8/JE.pm line ...


It looks like an error in
JE.pm
(JavaScript Engine), which seems to be stable. This JE is called from
WWW::Scripter
, which seems to be also stable module.

Tracking JavaScript source I realized, that such error sometimes (not always) happens on the following part of JavaScript:

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


which seems to be correct as well.

Let's take a look at a section of
JE.pm
, where the error occurs >>

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(@_) },
);


and the "line", where such error occurs is its bottom part, so >>

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


So what is wrong? What exactly error unblessed reference in this case means?

Answer Source

An unblessed reference is one where one variable is not a legal reference to an object, but yet you're trying to call a function on it as if it was a legal object.

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

It's likely that $m in your above text is the function name addEventListener but shift->value isn't returning a proper object that has been "blessed". It's a way of stating what package functions should be called inside of. Here's some example code:

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";

And running the above will produce:

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

Now, why your code above is resulting in an unblessed object you'd have to do lot more debugging to discover.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download