2014-03-06 61 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

相关问题