2009-09-06 67 views
2

我有這兩個模塊:爲什麼在這個例子中直接設置@ISA不起作用?

package G1; 

sub new { 
    my $class = shift; 
    my $self = { 
     one => 1, 
     two => 2, 
     three => 3 
    }; 
    bless $self,$class; 
    return $self; 
} 

sub three { 
    my $self = shift; 
    print "G1 green is ",$self->{three}; 
} 

1; 

package G2; 

our @ISA = qw(G1); 
#use base qw(G1); 

sub new { 
    my $class = shift; 
    my $self = $class->SUPER::new(); 
    $self->{three} = 90; 
    bless $self,$class; 
    return $self; 
} 

sub three { 
    my $self = shift; 
    print "G2 rox!\n"; 
    $self->SUPER::three(); 
} 

1; 

和下面的腳本:

use G2; 

my $ob = G2->new(); 
$ob->three(); 

當我運行該腳本,它產生以下錯誤:

Can't locate object method "new" via package "G2" at G2.pm line 8. 

如果我更換@ISAuse base一致,該腳本起作用。我試圖覆蓋一些方法並在之後調用原始方法。我究竟做錯了什麼?

+1

如果你得到一個錯誤,*任何東西*,如果你有第一次檢查「使用嚴格的;使用警告;」然後再試一次:)機會是你會更好地瞭解哪裏出了問題。 – Ether 2009-09-06 16:54:28

回答

4

因爲G2.pm需要包括use G1;線。沒有這個,G1.pm永遠不會被加載。如果有警告運行,Perl會告訴你:

$ perl -w t.pl 
Can't locate package G1 for @G2::ISA at t.pl line 1. 
Can't locate package G1 for @G2::SUPER::ISA at G2.pm line 8. 
Can't locate package G1 for @G2::SUPER::ISA at G2.pm line 8. 
Can't locate object method "new" via package "G2" at G2.pm line 8. 

通知所有無法找到包G1 ...錯誤。

而且是明確的,use base 'G1'作品因爲也做了use G1

+0

這對我來說很愚蠢,但不管我讀過多少次代碼,我都沒有注意到這一點。謝謝! – Geo 2009-09-06 11:32:15

+0

總是'使用警告'和'嚴格使用';這兩個將爲您節省無數小時的調試時間。 – 2009-09-06 16:58:31

2

G2需要了解G1,而不僅僅是名字。 Add

require G1; 

to G2.pm.

相關問題