我的问题如下
我从一个不同的位置运行代码 这就像./abc/xyz/blah1/blah2/../../。我在这里运行代码。
我创建了env params
setenv def ./abc/def
setenv xyz ./abc/xyz
我尝试了以下解决方案
Begin { push(@INC, $ENV{def}."/lib" ) }
同时为我使用的其他库提供路径
使用lib $ ENV {xyz}。" / lib"
这个解决方案没有用。我收到错误说明./abc/def/lib中的库 不包括在内。
我尝试了FindBin
# for the libs present in ./abc/def/lib
use FindBin;
use lib "$FindBin::Bin/../../";
use mylib::abc;
use mylib::def;
(我尝试给出root的路径,从哪里开始寻找..在FindBin中)
我尝试使用不同的组合但不确定为什么它不起作用。 有人可以指出我做错了什么,或者我对FindBin的理解是错误的。
答案 0 :(得分:3)
你不能说出你遇到的问题。只是说你不知道为什么它不起作用"并不是很有帮助。我假设您已经无法在@ INC"中找到[某些模块]。错误。
有三种(推荐的)方法可以更改@INC
的值。每个都有它们的用途。
use lib
-I
PERL5LIB
在所有这些情况下,新目录将被添加到@INC
的开头,因此将在标准库目录之前搜索这些目录。
您也可以手动操作@INC
。请注意,为了使@INC
的人工操作对代码中的use
语句产生任何影响,它们需要在BEGIN
块中执行(如use
语句在编译时执行)。看起来你也尝试过,但你使用的是Begin
而不是BEGIN
- 这是行不通的。
如果从与保留库的目录完全无关的位置运行程序,则FindBin可能用途有限。 FindBin在可执行文件的位置和库密切相关的情况下非常有用(例如,可执行文件位于./bin
,库位于./lib
)。
您似乎也在尝试从库中调整@INC
(./abc/xyz/lib/tuv/abc.pm
)。请注意,FindBin不会将$FindBin::Bin
设置为此目录。 $FindBin::Bin
始终设置为包含正在运行的可执行文件的目录。
在不了解您正在使用的实际路径的情况下(您的示例中仅提供了相对路径),很难确定最佳方法是什么。但我认为在您的情况下,我会将PERL5LIB
设置为额外库的绝对路径。
答案 1 :(得分:0)
FindBin
模块最适合您的需求。要记住的重要一点是$FindBin::Bin
指的是包含脚本的目录。所以当你提到它时......
use lib $FindBin::Bin . '/../../etc';
' /../.. 39; path必须描述从脚本目录到lib目录的路径。
要考虑的另一个重要事项是错误消息。它将从Can't locate Your/Module/Name.pm
开始,然后继续列出@INC
中的所有目录 - 库搜索路径。检查此目录列表以确保它包含您要添加的lib路径。