2012-03-14 61 views
0

我有一個使用模式WWW::Scripter的Perl應用程序。它解析非常龐大的代碼,並且所有的工作都很棒,只是出現了一個我無法理解的問題。Perl中的未引用參考

我收到錯誤

無法調用 「的addEventListener」 關於在/usr/lib/perl5/site_perl/5.8.8/JE.pm線unblessed參考 ...

它看起來像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(@_) }, 
     ); 

和「線」,在出現這種錯誤是它的底部,所以>>

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

那又怎麼了?究竟是什麼錯誤未解決的參考文獻在這種情況下意味着什麼?

+0

有些幫助:'perl -Mdiagnostics -e'$ foo = {}; $ foo-> method'' – mob 2012-03-14 21:17:41

+0

[JE模塊目前是alpha](https://metacpan.org/module/JE)。嘗試製作一個引發錯誤的最小測試案例。微小的文檔,小腳本。從輸入文檔中刪除引發錯誤的內容以縮小範圍。 – Lumi 2012-03-14 22:18:37

回答

8

一個沒有引用的引用是一個變量不是對象的合法引用,但是你試圖對它調用一個函數,就好像它是一個合法對象一樣。

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

這可能是因爲$m在你上面的文字就是函數名addEventListenershift->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. 

現在,爲什麼你上面的代碼導致的unblessed對象,你必須做很多的調試發現。