<pre name="code" class="html">[root@wx03 test]# cat Horse.pm Horse 类: package Horse; #our @ISA = "Critter"; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; }; sub sum_arr { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; 1; Critter类: package Critter; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; 1; 此时Horse 类没有继承Critter类: [root@wx03 test]# cat t6.pl unshift(@INC,"/root/test"); use Horse;; #use base qw(Critter); require Critter; use Data::Dumper; $ed = Horse->new; # 四腿湾马 print $ed->sum_arr(4,5); print " "; print $ed->sum(4,5); [root@wx03 test]# perl t6.pl 16 Can't locate object method "sum" via package "Horse" at t6.pl line 9. 此时无法找到sum方法 当 Perl 搜索一个方法的时候,它确信你没有创建一个闭环的继承级别。如果两个类互相 继承则可能出现这个问 题,甚至是间接地通过其他类这样继承也如此。 模拟递归继承: [root@wx03 test]# cat Horse.pm package Horse; our @ISA = "Critter"; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; }; sub sum_arr { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; 1; [root@wx03 test]# cat Critter.pm package Critter; our @ISA = "Horse"; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; 1; 此时报错: [root@wx03 test]# cat t6.pl unshift(@INC,"/root/test"); use Horse;; use base qw(Critter); require Critter; use Data::Dumper; $ed = Horse->new; # 四腿湾马 print $ed->sum_arr(4,5); print " "; print $ed->sum(4,5); [root@wx03 test]# perl t6.pl Recursive inheritance detected in package 'Critter' at Critter.pm line 2. Compilation failed in require at /usr/local/perl/lib/5.22.1/base.pm line 99. ...propagated at /usr/local/perl/lib/5.22.1/base.pm line 108. BEGIN failed--compilation aborted at t6.pl line 3. [root@wx03 test]# 检测到递归继承 /************************** [root@wx03 tmp]# cat Horse.pm package Horse; use base qw(Critter); sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; }; sub sum_arr { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; 1; [root@wx03 tmp]# cat Critter.pm package Critter; use base qw/Horse/; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; 1; [root@wx03 tmp]# ca t6.pl -bash: ca: command not found [root@wx03 tmp]# cat t6.pl unshift(@INC,"/tmp"); use Horse;; $ed = Horse->new; # 四腿湾马 print $ed->sum_arr(4,5); print " "; print $ed->sum(4,5); [root@wx03 tmp]# perl t6.pl Recursive inheritance detected in package 'Horse' at /usr/local/perl/lib/5.22.1/base.pm line 137. BEGIN failed--compilation aborted at Horse.pm line 2. Compilation failed in require at t6.pl line 2. BEGIN failed--compilation aborted at t6.pl line 2. [root@wx03 tmp]#