2012-03-14 4 views
0

私は、WWW::Scripterモードを使用するPerlアプリケーションを持っています。それは非常に巨大なコードとすべての素晴らしい作品を解析する、私は理解できない1つの問題が発生します。Perlで無制限の参照

私はエラー

が... /usr/lib/perl5/site_perl/5.8.8/JE.pmラインでblessされていない参照 の "addEventListenerを"

のメソッドを呼び出すことはできません取得しています

JE.pm(JavaScriptエンジン)のエラーのようですが、これは安定しているようです。このJEはWWW::Scripterから呼び出され、安定したモジュールと思われます。私は時々、そのような誤差を実現

トラッキングJavaScriptソース(常にではない)はJavaScriptの以下の部分に起こる:

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

としても正しいと思われます。

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

>>エラーが発生するのは、JE.pmの部分を見てみましょうと、このようなエラーが発生し、「行」は、その下の部分ですので、>>

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

何が問題なのですか?正確には何のエラーこの場合は、参照されていない参照

+0

いくつかの助けがあります: 'perl -Mdiagnostics -e '$ foo = {}; $ foo-> method'' – mob

+0

[JEモジュールは現在アルファ](https://metacpan.org/module/JE)です。エラーを引き起こす最小限のテストケースを作成してみてください。小さな文書、小さなスクリプト。入力文書から切り捨てて、エラーを引き起こしたものを絞り込みます。 – Lumi

答えて

8

無制限参照とは、1つの変数がオブジェクトに対する正当な参照ではなく、正当なオブジェクトであるかのようにその上で関数を呼び出そうとしている参照です。

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

上記のコードがblessされていないオブジェクトが得られている理由さて、あなたは発見するために、より多くのデバッグを行う必要があるだろう。

関連する問題