2014-10-17 32 views
1

我在与想要使用它的Perl程序相同的目录中创建一个名为Base.pm的模块,但该模块似乎未加载。将模块的名称更改为Base以外的任何东西,并且工作正常。 Base.pm有什么特别之处,并且如何覆盖这种行为?感谢您的任何见解。Base.pm的特殊处理?

package Base; 
use strict; 
use Exporter; 
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); 
$VERSION  = 1.00; 
@ISA   = qw(Exporter); 
@EXPORT  = qw(func); 
sub func { return "foo"; } 
1; 

use Base; 
print func(); 

产生

Undefined subroutine &main::func called at test0.pl line 2. 

package Case; 
use strict; 
use Exporter; 
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); 
$VERSION  = 1.00; 
@ISA   = qw(Exporter); 
@EXPORT  = qw(func); 
sub func { return "foo"; } 
1; 

use Case; 
print func(); 

产量

foo. 
+0

虽然没有重复,[这个问题](http://stackoverflow.com/q/658955/8355)是有关到你的情况。 – cjm 2014-10-17 20:12:17

回答

8

base.pm是一个核心系统 “编译” 模块(这些天,它弃用parent.pm

use base 'MyBaseClass'; # Same as: our @ISA = ('MyBaseClass'); 

这可能是一个Windows的情况下的事情。 Perl查找“Base.pm”,但窗口返回“base.pm”。当你将它命名为“Base以外的任何东西”时,你可能没有将它重命名为另一个Perl模块。你可以检查此

一种方法是运行以下命令:

  • useData::Dumper
  • 打印的%INC转储(图一所有加载的模块和他们在那里装)

    use Data::Dumper; 
    ... 
    use Base; 
    ... 
    print Dumper(\%INC); 
    

查找'base.pm''Base.pm'看看Perl加载了什么。

2

检查%INC看到实际上是被加载的内容:

use Base; 

print $INC{'Base.pm'}; 

输出:

/Users/miller/perl5/perlbrew/perls/perl-5.20.0/lib/5.20.1/Base.pm 

我在一个不区分大小写的OSX的分区,所以这个文件对应于base编译。

为了避免这种类型的问题,给你的项目一个私人的命名空间。这种方式有一个与当前或未来的Perl核心或CPAN模块相互冲突的风险较小:

package MyProject::Base;