1

我有一个问题,我想use local::lib;在一个脚本中。但是因为我需要在很多地方使用这个脚本,所以我不想尝试添加evalto bashrc,每次我将此脚本安装到服务器时。而且我无法在服务器上全局(默认)安装local::lib 。@INC我有什么办法可以use local::lib从脚本中知道模块local::lib在没有eval推荐local::lib的情况下并且不将其安装到服务器上默认的目录中@INC

4

2 回答 2

3

您至少需要知道 local::lib 的安装位置,而且您不会绕过指定它,因此您需要一个 shell 命令或环境变量声明。假设您使用了默认值--bootstrap,这是 bash 中 Perl 查找库的最小示例:

# persistent for this shell only
export PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"')
perl yourprog
perl yourprog
perl yourprog

要不就

# environment for one run of perl only
PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"') perl yourprog

简单地对目录名称进行硬编码是安全的,从而避免了 eval 和对 perl 的调用。

use local::lib;将从扩展的@INC. %INC如果您确实需要,请检查以查看特定位置。

警告:您现在不能使用 local::lib 来安装其他模块,这需要在它打印出来的通常 eval 中进行的其余声明。


使用下面的重新执行技巧从内部设置环境变量。

use autodie qw(:all);
unless ($ENV{REEXEC}) {
    $ENV{REEXEC} = 1;
    $ENV{PERL5LIB} = …
    exec $^X, $0;
}
# main starts here
于 2011-01-12T07:48:52.297 回答
1

尽管我在常规 @INC 的所有盒子上都安装了 local::lib ,但脚本顶部的类似内容应该可以工作,因此它未经测试–</p>

use lib "/path/to/local/lib's/lib";
use local::lib "/path/to/specific/local-lib/base/you/want";

我建议以相同的方式安装 local::lib,在默认的@INC 中使用您的主环境 perl。它可以创建的各种本地存储库与其位置无关。

于 2011-01-14T22:04:38.880 回答