2014-03-06 121 views
0

我有一個文件Scanners.pm其中包含2個軟件包。我希望這兩個包都導出一些名稱。我不希望這些軟件包放在單獨的文件中,我希望它們在一個文件中。當包名與文件名不同時如何導出名稱?

當我寫

package SCAN; 

use Exporter; 
our @ISA  = qw(Exporter); 
our @EXPORT = qw(@SCANNERS @NAMES %NAMES name_index process_scanners); 
our @EXPORT_OK = qw(); 

,然後在調用特等在@EXPORT列表文件

use Scanner; 

的名字不會被導出。我如何做到這一點?

+0

爲什麼他們需要在同一個文件 – justintime

+0

@justintime,模塊隨着時間的推移而演變,必須保持在一起。將它們保存在一個文件中是確保它們相互匹配並保持在一起的方式之一。 – nsg

+0

他們爲什麼「必須呆在一起」。系統發展,有時你需要重新組織代碼的可維護性。 – justintime

回答

2

您可以爲您的掃描儀軟件包創建一個自定義導入子。 Exporting Without Using Exporter's import Method

請注意,如果用戶只依賴默認的@EXPORT,則此代碼僅適用。如果你希望他們能夠指定他們想要的功能,那麼你必須在調用export_to_level之前進行過濾。

package Scanner; 

use Exporter; 
our @ISA  = qw(Exporter); 
our @EXPORT = qw(scannersub); 

use strict; 
use warnings; 

sub import { 
    Scanner->export_to_level(1, @_); 
    ScannerTwo->export_to_level(1, @_); 
} 

sub scannersub { 
    print "scanner->sub says hi\n"; 
} 


package ScannerTwo; 

use Exporter; 
our @ISA  = qw(Exporter); 
our @EXPORT = qw(scannertwosub); 

sub scannertwosub { 
    print "scannertwo->sub says hi\n"; 
} 

1; 

__END__ 

和腳本

use Scanner; 

use strict; 
use warnings; 

scannersub(); 
scannertwosub(); 

1; 

__END__ 

最後,我會是房產管理信息系統,如果我沒有提到,這不是它的表面上的好主意。這個代碼的未來維護者不會輕易追蹤這些潛艇。所以無論你想在同一個文件中使用不同的軟件包的理由,我懷疑有一個更好的解決方案。

+1

'use Scanner'調用'Scanner :: import',所以這就是你需要從第二個包中導出符號的地方。 – mob

相關問題