如果我有一个
.pm
文件,有没有办法可以 use
它,而不将其放在我的 @INC
路径上?我认为这在我的特定用例中会更清晰 - 比使用相对路径或将此目录添加到@INC
更清晰。
我希望避免遍历
@INC
中的每个项目,而是直接指定我感兴趣的文件。例如,在 Node.JS 中,require('something')
将搜索路径列表,但是 require('/specific/something')
会直接去我告诉它的地方。
在 Perl 中,我不确定这是否与
require
中的功能相同,但它似乎有效。
但是,
use
陈述需要裸词。这让我对如何输入绝对路径有点困惑。
你可以使用这个:
use lib '/path/to/Perl_module_dir'; # can be both relative or absolute
use my_own_lib;
你可以自己修改
@INC
(暂时不用怕,use lib
也是这么做的):
BEGIN{ @INC = ( '/path/to/Perl_module_dir', @INC ); } # relative or absolute too
use my_own_lib;
根据评论中的讨论,我建议使用
require
本身。就像下面这样,
require "pathto/module/Newmodule.pm";
Newmodule::firstSub();
您也可以使用以下其他选项
use lib 'pathto/module';
此行需要添加到您想要使用该模块的每个文件中。使用 lib '路径/模块';
使用新模块;
使用
PERL5LIB
环境变量。使用导出在命令行上设置它或将其添加到~/.bashrc
,以便每次登录时它都会添加到您的@INC
。请记住 PERL5LIB 在所有 @INC 目录之前添加目录。所以会先使用它。您也可以使用 在 apache httpd.conf 中设置它
SetEnv PERL5LIB /fullpath/to/module
或者将其设置在BEGIN块中。
一般来说,设置
PERL5LIB
环境变量。
export PERL5LIB=/home/ikegami/perl/lib
如果要查找的模块打算安装在与脚本相关的目录中,请使用以下命令:
use FindBin qw( $RealBin );
use lib $RealBin;
# or
use lib "$RealBin/lib";
# or
use lib "$RealBin/../lib";
这将正确处理脚本的符号链接。
$ mkdir t
$ cat >t/a.pl
use FindBin qw( $RealBin );
use lib $RealBin;
use Module;
$ cat >t/Module.pm
package Module;
print "Module loaded\n";
1;
$ ln -s t/a.pl
$ perl a.pl
Module loaded
您可以使用 Module::Load 模块
use Module::Load;
load 'path/to/module.pm';
FindBin::libs 可以解决问题:
# search up $FindBin::Bin looking for ./lib directories
# and "use lib" them.
use FindBin::libs;