2010-09-08 69 views
-1

我有一个使用已安装软件包的Perl脚本。一个是Perl包,另一个是Perl XS包。如何将Perl模块包含与程序相关的路径?

现在我想调用此脚本,但使用未安装的包,但使用路径名称相同的包。

我以前perl -I /home/.../lib script.pl,但它不工作

我该怎么办呢?

+3

看哥们,不工作是一个强烈的声明。它整天坐在沙发上吗?它在你脸上吗?它需要更多的钱吗?它和你的女朋友在睡觉吗?请具体! :-) – rafl 2010-09-08 14:11:54

+0

所以问题是你正在尝试加载你自己的软件包,但是正在加载一个默认软件包呢? – flies 2010-09-08 17:51:21

回答

1

您可以使用lib编译指示将路径前缀到路径perl用于查找模块。

所以,如果有一个名为安装在默认目录Foo模块和安装在/home/cowens/perl5不同的版本,你可以说

use lib "/home/cowens/perl5"; 
use Foo; 

perl将在/home/cowens/perl5找到的版本。

+0

不幸的是,这不是我的脚本,所以我不能修改它。我只是可以运行它的选项 – Nikita 2010-09-08 14:11:36

5

对于影响您的模块被加载的各种方法,请参阅本SO发布:

How is Perl's @INC constructed? (aka What are all the ways of affecting where Perl modules are searched for?)

+0

我已经尝试了列表中的每个aproach /但它没有帮助/我仍然不能使用我自己的模块( – Nikita 2010-09-08 14:36:24

+1

)您需要指定确切的软件包名称,以帮助我们更详细地 - 提供'use xxx'行 – DVK 2010-09-08 14:47:22

+1

另外,请指定模块代码的确切目录结构 – DVK 2010-09-08 14:59:49

1

,你能否告诉我们的目录的递归上市那里你存储你想要的模块使用? ls -R可以帮助我们找出是否有正确的路径。

当您使用-I开关时,您必须确保您在那里找到正确的路径。如果你使用一个模块:

use Some::Module; 

的Perl实际上看起来为:

$lib/Some/Module.pm 

$lib@INC的目录之一。另一种说法是,如果特定目录不在@INC中,Perl不会查看它。这意味着Perl不会自动在你的子目录中查找

如果你的模块不在那个位置,那么Perl不会在那个$lib周围翻遍寻找它。你的XS模块可能不是这样存储的。它可能路径中有一个Perl的版本和结构的项目,所以你可能会发现它在:

$lib/5.10.1/darwin-2level/Some/Module.pm 

你需要,如果你正在使用-I自己添加这些路径。

但是,您可以在命令行上加载模块。这是很容易使用lib,增加了额外的目录,为您提供:

perl -Mlib=/path/to/lib ... 
+0

-I和-Mlib的优缺点什么 – justintime 2010-09-09 01:08:17

+1

好处和风险取决于你在做什么。还有一个是向@INC添加arch和版本dirs,无论好坏取决于你想要的。 – 2010-09-09 05:11:53

相关问题