如何包含位于不同目录中的Perl模块?

如何包含位于不同目录中的Perl模块? 它需要是包含它的模块的相对path。

我试过了

push ( @INC,"directory_path/more_path"); 

 push ( @INC,"directory_path\\more_path"); 

编辑:把正确的解决scheme,原来从这个问题 。 这是唯一一个相对于模块目录进行search的地方:

 use FindBin; # locate this script use lib "$FindBin::Bin/.."; # use the parent directory use yourlib; 

search与当前目录相关的库有许多其他方法。 您可以使用-I参数调用perl,传递另一个模块的目录:

 perl -I.. yourscript.pl 

您可以在perl脚本的顶部附近添加一行:

 use lib '..'; 

在运行脚本之前,您可以修改环境variablesPERL5LIB:

 export PERL5LIB=$PERL5LIB:.. 

推(@INC)策略也可以工作,但必须将其包装在BEGIN {}中以确保在模块search之前运行该推送:

 BEGIN {push @INC, '..'} use yourlib; 

你推动不起作用的原因很可能是执行顺序。

use是编译时指令。 你push在执行时间完成:

 push ( @INC,"directory_path/more_path"); use Foo.pm; # In directory path/more_path 

您可以使用BEGIN块来解决此问题:

 BEGIN { push ( @INC,"directory_path/more_path"); } use Foo.pm; # In directory path/more_path 

国际海事组织,这是最清楚的,因此最好use lib

 use lib "directory_path/more_path"; use Foo.pm; # In directory path/more_path 

有关BEGIN和其他特殊块以及执行时间的信息,请参阅perlmod 。

编辑

为了加载相对于脚本/库的代码,我强烈支持File :: FindLib

你可以说use File::FindLib 'my/test/libs'; 在path的脚本上方的任何位置查找库目录。

说你的工作是这样构build的:

  /home/me/projects/ |- shared/ | |- bin/ | `- lib/ `- ossum-thing/ `- scripts |- bin/ `- lib/ 

ossum-thing/scripts/bin的脚本里面:

 use File::FindLib 'lib/'; use File::FindLib 'shared/lib/'; 

将find你的图书馆目录,并将其添加到您的@INC

创build一个包含运行套件所需的全部环境设置的模块,并将其加载到项目中的所有可执行文件中也是非常有用的。

 use File::FindLib 'lib/MyEnvironment.pm' 

'使用lib'也可以采取单个string值…

 #!/usr/bin/perl use lib '<relative-path>'; use <your lib>; 

来自perlfaq8:


如何将我的程序所在的目录添加到模块/库searchpath?

(由布莱恩福伊提供)

如果您已经知道该目录,则可以将其添加到@INC,就像您对其他目录一样。 如果您在编译时知道该目录,则可以使用lib:

 use lib $directory; 

这个任务的诀窍是find目录。 在脚本执行任何其他操作(如chdir)之前,可以使用Perl自带的Cwd模块获取当前的工作目录:

 BEGIN { use Cwd; our $directory = cwd; } use lib $directory; 

您可以使用$ 0的值来执行类似的操作,该值包含脚本名称。 这可能会保持一个相对path,但rel2abs可以把它变成一个绝对path。 一旦你有了

 BEGIN { use File::Spec::Functions qw(rel2abs); use File::Basename qw(dirname); my $path = rel2abs( $0 ); our $directory = dirname( $path ); } use lib $directory; 

Perl自带的FindBin模块可能工作。 它find当前正在运行的脚本的目录,并将其放入$ Bin中,然后可以使用它来构build正确的库path:

 use FindBin qw($Bin); 

我很惊讶之前没有人提到它,但FindBin :: libs将始终find您的库,因为它在相对于您的脚本的位置的所有合理的地方进行search。

 #!/usr/bin/perl use FindBin::libs; use <your lib>; 

我会告诉你如何在eclipse中完成。 我的开发系统 – Windows 64bit,Eclipse Luna,用于eclipse的Perlipse插件,草莓珍珠安装程序。 我使用perl.exe作为我的解释器。

Eclipse>创build新的Perl项目>右键单击项目>构buildpath>configuration构buildpath>库选项卡>添加外部源文件夹>转到所有perl模块安装的文件夹>确定>确定。 完成!