2011-07-22 76 views
3

我在Perl中有一個共享模塊。主程序需要兩個文件,第一個是共享文件(我們稱它爲'X'),第二個爲'包'文件。文件'X'也包含在使用'require'的'包'文件中。當我編譯這個程序,它給了我以下錯誤:Perl問題「需要」相同的文件

Undefined subroutine &main::trim called at testing.pl line 8. 

我的理解是,perl找不到trim()模塊。如果我不包含軟件包文件,那麼這將運行沒有任何問題。

任何人都可以解釋這個問題?

這是我的代碼:

主程序:testing.pl

#!/usr/bin/perl -w 

use strict; 
use postgres; 

require "shared.pl"; 

trim("als"); 

包文件:postgres.pm

#!/usr/bin/perl 

package postgres; 

use strict; 
use DBI; 

require "shared.pl"; 

1; 

共享文件:shared.pl

#!/usr/bin/perl 

# ============= 
# shared module 
# ============= 

use strict; 

sub trim($) 
{ 
} 

1; 

回答

2

默認情況下,require將只加載一次文件。在這種情況下,那一次來自文件postgres.pm,在postgres包中。因此,trim子例程在postgres名稱空間中被定義爲&postgres::trim

一個解決辦法是在testing.pl文件中使用完全合格的子程序名:

postgres::trim("als");  # not trim("als") 

另一個解決辦法是破解%INC表(即跟蹤的內容模塊/文件已經use變量「d和require」 d),這樣你可以重新加載shared.pl到主包裝:

use postgres; 

delete $INC{"shared.pl"}; 
require "shared.pl"; 

第三個解決方法是導出trim功能從postgres包到主包。 Exporter模塊的文檔很好地介紹了爲什麼以及如何完成這個過程。

# in postgres.pm 
*main::trim = *trim; 

# or in testing.pl 
*trim = *postgres::trim; 
trim("als"); 
+1

'delete $ INC {「shared.pl」};'waaaa?拿去! – ikegami

5

如果模塊不使用package,你想do,而不是require。見What is the difference between library files and modules?

do "shared.pl" or die [email protected]; 

您真的應該創建一個合適的模塊,其中一個使用package語句。

package Shared; 

use strict; 
use warnings; 

our @EXPORT = qw(trim); 
use Exporter qw(import); 

sub trim { ... } 

1; 

名稱的文件Shared.pm使用use Shared;加載它。

+0

謝謝你指出這一點。很顯然,我仍然有很多東西需要學習如何在perl中正確編碼。 – lwijono