2010-04-07 29 views
5

我使用use lib "./DIR"从其他地方的文件夹中获取库。但是,它似乎不能在我的服务器上工作,但它在我的本地桌面上正常工作。 有什么特别的原因?Perl的lib pragma是如何工作的?

还有一个问题,use lib会在几个模块中传播吗?

两种情况: 假设我需要一些库的基类,但我知道它需要扩展,扩展类需要使用另一个库。我可以将use lib命令放在基类中吗?还是我需要把它放在每个扩展课堂上?

最后,我可以只有一个use package其中软件包包含一堆使用lib,它会传播使用lib语句到我的当前模块? < - 我不这么认为,但总是询问

回答

3

use lib语句中的.表示“当前工作目录”,并且只有当脚本从正确的目录运行时才有效。服务器的cwd想法可能有些不同(或未定义)。假设库目录协同定位与脚本和私人它,你想要做这样的事情,而不是:

use FindBin; 
use lib "$FindBin::Bin/DIR"; 

一个use lib语句影响@INC - 位置列表perl的搜索时,你userequire一个模块。它在全球范围内影响解释器的当前实例。您应该只将use lib语句放在脚本中,而不是放在模块中。

原则上,你可以有一个package MyLibs是由一堆use lib语句,然后use MyLibs使用任何在这些位置的包之前,但我不会推荐它。

+0

我用getcwd弄清楚了哪里“。”是。只是想知道是否有可能找出perl脚本的位置?当我尝试使用FindBin时,它不工作,因为lib和bin不在同一位置。所以这里是我想要做的一个例子。我从说folder1运行perl脚本。它使用lib“/ abs/path/topack /”;使用包。在包中,我使用lib'./FOLDER2';假设cwd将是相同的。由于“。”指向Folder1,而不是路径。这是错误的。我如何不使用包中的绝对路径还能够使用。?可能吗? – Tyug 2010-04-12 18:55:53

+0

@Tyug:您可以通过检查'%INC'来确定模块的加载位置。有关类似的问题,请参阅http://stackoverflow.com/questions/1463414,以便您指出正确的方向。 – 2010-04-12 19:22:54

+0

非常感谢! – Tyug 2010-04-13 12:56:02

2

没有更多的信息,没有办法知道它为什么不能在你的服务器上工作。特别是,检查您的服务器的错误日志,并在需要时转储@INC,并将其与您的实际库路径进行比较。

use lib修改@INC,这是全球性的,只要您在其他软件包尝试包含东西之前执行use lib,它就会工作,所有其他软件包将看到新的包含路径。

有关@INC的更多信息,请参见perlvar中的条目。

相关问题