2016-09-07 50 views
0

我有兩個Perl模塊onee.pm和two.pm和一個Perl的script.Following是one.pm繼承在Perl是表示我的情況下,錯誤

package one; 
sub foo 
{ 
print "this is one\n"; 
} 
sub goo 
{ 
print "This is two\n"; 
} 
1; 

two.pm

package two; 
use one; 
@ISA=(one); 
sub hoo 
{ 
    print "this is three \n"; 
} 
1; 

inherit.pl

use two; 
foo(); 

當我執行inherit.pl我收到以下錯誤。

Undefined subroutine &main::foo called at inherit.pl line 2. 
+0

[Perl的@INC是如何構建的? (又名什麼是影響Perl模塊搜索的方式?)](http://stackoverflow.com/questions/2526804/how-is-perls-inc-constructed-aka-what-are-all-the影響,在哪裏) – dubes

+1

@dubes我不同意這種評估。 – simbabque

回答

4

繼承對物體起作用。你想要做的是導入,而不是繼承。我在下面概述了一個繼承和導入的例子。

繼承:

One.pm

package One; 

sub foo { 
    print "this is one\n"; 
} 
1; 

Two.pm

package Two; 

# Note the use of 'use base ...;'. That means that we'll inherit 
# all functions from the package we're calling it on. We can override 
# any inherited methods by re-defining them if we need/want 

use base 'One'; 

sub new { 
    return bless {}, shift; 
} 
1; 

inherit.pl

use warnings; 
use strict; 

use Two; 

my $obj = Two->new; 
$obj->foo; 

導入:

One.pm

package One; 

use Exporter qw(import); 
our @EXPORT_OK = qw(foo); # allow user to import the 'foo' function if desired 

sub foo { 
    print "this is one\n"; 
} 
1; 

Two.pm

package Two; 
use One qw(foo); # import foo() from One 

use Exporter qw(import); 
our @EXPORT_OK = qw(foo); # re-export it so users of Two can import it 

1; 

import.pl

use warnings; 
use strict; 

use Two qw(foo); 

foo(); 

需要注意的是,在未來的Perl版本(5.26。0),則@INC默認不包含當前工作目錄,因此如果這些模塊文件位於本地目錄中,則爲use One;use Two;,則必須添加use lib '.';unshift @INC, '.';等。

+1

謝謝你解釋繼承和導入 –

3

繼承與它無關。您不會導出任何內容,因此foo子例程不在腳本的名稱空間中。

事實上,你也在混合面向對象的概念(繼承)和經典的Perl模塊。如果你有一個非OOP模塊,你可以有導出器並將腳本帶入你的腳本。如果你有一個類,你可以繼承另一個類。但是你通常不會輸出任何東西。

現在,如果你想使用twoone進口的東西,基本上是建立類似的通用功能的集合,你就需要在two使用出口商在one,然後use one,然後用出口商在two導出功能從one導入。

聽起來很複雜嗎?這確實是因爲它很複雜。除非在腳本中保存了一行use one,否則這樣做並沒有真正的好處。

+0

你說的事情在我的情況下工作謝謝你 –

相關問題