2011-06-05 67 views
4

我用我的Perl脚本Perl模块文件:如何告诉perl模块的路径?

printtab.pl

use Table; 

Table.pm存在于同一个目录中printtab.pl,所以只要我从目录中执行printtab ,它执行得很好。

但是,如果我从其他地方执行它,例如,使用cronjob,我收到一个错误提到在@INC中找不到该模块。

解决此问题的正确方法是什么?

我试图

push @INC, "/path/Table.pm"; 

,但它不工作。 你能告诉我为什么吗?

我发现了大约use lib,它工作正常

use lib "/path"; 

就是在这样的情况下使用的lib最好的方法是什么?

+0

'use lib ..'是最好的。您也可以在运行脚本之前设置PERL5LIB环境变量:http://perldoc.perl.org/perlrun.html或者使用-I/path/switch运行perl。 – Alex 2011-06-06 01:20:49

+2

'使用FindBin qw($ Bin);使用lib $ Bin;使用lib“$ Bin /../ lib”;' – tchrist 2011-06-06 04:27:07

回答

14

use lib是一个不错的选择。但你把你的模块在同一目录下的程序(或相对于包含你的程序的一个子目录),你可以使用use FindBin;像:

use FindBin; 
use lib "$FindBin::Bin/../lib"; 
+1

这是**正确的答案。 'FindBin'就是为这件事设计的。 – tchrist 2011-06-06 04:20:42

4
push @INC, "/path/Table.pm"; 

不会因为@ WORK INC应该是目录列表,而不是模块的完整路径。所以如果你这样做:

push @INC, "/path"; 

它应该工作。

话虽如此,use lib "/path";也是一个不错的选择。

根据您的程序的安装目录结构,使用FindBin确定脚本的真实位置可能对构建模块的正确路径有用。

1

一个整洁的小窍门:

#! /usr/bin/env perl 

use strict; 
use warnings; 

BEGIN { 
    our $moduleIsMissing; 
    eval { 
     require My::Module; 
    }; 

    if ([email protected]) { 
     $moduleIsMissing = 1; 
    } 
} 

if ($main::moduleIsMissing) { 
    print "Module is missing. I've got to do something about it!\n" 
} 
else { 
    print "Module is there. I'm fine!\n"; 
} 

我不开心关于$main::moduleIsMissing的事情,但我还没有想出办法解决它。

如果My::Module可用,它已加载,一切都很好。否则,设置$main::moduleIsMissing标志。这允许您测试以查看模块是否已加载,如果没有,则采取回避措施。例如,如果模块Term::Cap可用,您的程序将在打印文本时使用粗体显示,但如果不可用,则只会将文本打印出粗体。


回到一个问题:这是更好的事:

use lib "MyDir"; 

而非@INC

use lib包含编译时的目录。因此,如果我在目录“MYDIR”模块“富::酒吧”,我可以这样做:

use lib qw(MyDir); 
use Foo::Bar; 

没有Perl的抱怨。如果我这样做:

push (@INC, qw(MyDir)); 
use Foo::Bar;; 

Perl会抱怨它无法找到我的模块。