我可以在单独的脚本中设置PERL5LIB并在其他脚本中调用该脚本吗?我该怎么做?它将如何影响使用它的脚本?
感谢。
答案 0 :(得分:7)
在运行时设置PERL5LIB
不会影响Perl的搜索路径。您需要在执行解释器之前导出变量
或者,您可以在编译时修改@INC
(也可以在单独的脚本/模块中执行):
BEGIN { unshift @INC, "/path/to/dir" }
这是lib
编译指示的作用。
答案 1 :(得分:3)
你可以通过'使用lib'而不是操纵环境来做到这一点:
use lib '/home/perl5';
这可能是您需要的单独文件。
答案 2 :(得分:1)
PERL5INC
是 shell 环境变量,因此您不会在Perl程序中设置它(通常),而是在调用Perl之前指定它。下面是一个shell命令,我使用PERL5LIB
指示prove
找到驻留在~/OnePop
中的Perl模块:
$ PERL5LIB=~/OnePop prove -l t
... PERL5LIB is unset here ....
当命令前面有这样的变量赋值时,shell会设置并将变量(PERL5LIB
)导出到该命令,但之后变量将再次取消设置。您还可以在shell中设置变量,以便所有后续命令都可以继承它。
$ export PERL5LIB=~/OnePop
...
$ prove -l t
... PERL5LIB continues to be set here ...
如果您忘记了上面示例中的export
关键字(即在单独的行中使用PERL5LIB=~/OnePop
分配值),则变量将在shell中设置,但它将不继承您运行的任何命令(意味着prove
将无法看到它。)
最后,如果你想在Perl程序中设置环境PERL5LIB
变量,你必须这样写:
$ENV{PERL5LIB} = glob("~/OnePop"); # glob() expands the tilde
system(qw( prove -l t ));
尽管正如其他人所指出的那样,如果你想在Perl中指定包含路径,那么使用use lib $PATH
会更容易/更好。
答案 3 :(得分:0)
PERL5INC是一个环境变量。环境变量只从父母继承到子女,不能(轻易)设置相反的方式。如果你想在外部文件中存储额外的搜索路径,我建议你把它作为一个简单的路径列表,写一个简单的循环来读取文件中的每个路径,并在当前进程中操作@INC。如果您希望在编译时尽早完成此操作,则必须使用BEGIN {}块。
例如
BEGIN{
open(INCFILE,"<","my.inc.file") or die($!);
foreach(<INCFILE>){
push @INC,$_;
}
close(INCFILE);
}
答案 4 :(得分:0)
您可以安装最新版本的Perl 5(当然,在非系统位置)。使用模块文件或完成所需的任何操作后,可以使shell显示新的perl
和cpan
可执行文件,您可以使用cpan
安装所需的所有模块。我有时会使用Python虚拟环境以类似的方式为单个应用程序执行此操作。