将模块目录添加到@INC

时间:2014-01-13 20:02:44

标签: perl

我有一堆脚本需要以顺序方式运行它们,如下所示

foreach my (qw (script1.pl script2.pl script3.pl ){

 my $script=File::Spec->catfile($Bin,'Scripts',$_);
 system "$^X $script";
}

每个脚本使用2个模块,这些模块位于lib库下,其中包含脚本,即

我有项目库,其中包含上述脚本,2个目录用于我的模块,另一个用于上述脚本运行的脚本,问题如何以动态方式将模块目录添加到@INC路径上上面的脚本,当我运行系统代码时,它将在@INC路径上找到lib目录。我试图使用以下内容:

BEGIN{
use lib File::Spec->catdir($Bin,'LIB');

}

但它不起作用吗?

我为循环中的每个脚本获得的错误

"BEGIN failed--compilation aborted at C:\Porject\Scripts\script1.pl line 4
Can't locate Detection.pm in @INC"

1 个答案:

答案 0 :(得分:5)

目前还不清楚你在哪里操纵@INC,但是我读你的问题的方式,似乎是你在script.pl中做到的。

简单地更改父级脚本@INC将不会影响您通过@INC来电调用的脚本system(),因为这些孩子的脚本将拥有自己的副本Perl翻译。

您需要在被调用的脚本中操作它(script1.pl,script2.pl,script3.pl)。

您可以通过以下三种方式之一完成:

  1. 通过从script.pl:

    调用脚本时添加“-I”Perl参数
    my $lib_path = File::Spec->catdir($Bin,'LIB'); 
    system "$^X -I $lib_path $script";
    

    好处:您只将代码放在一个脚本中(父代一个)。

    因此,这是我建议的解决方案。

  2. 让script1.pl(和2和3)根据脚本路径调整自己的@INC

    例如:

    use Cwd qw(abs_path);
    use FindBin;
    use lib abs_path("$FindBin::Bin/../LIB");
    

    好处:你不需要知道“$ Bin”。 下行:您需要编辑每个脚本。

  3. 让script1.pl(和2和3)根据您尝试放入父脚本的逻辑调整自己的@INC

    # Add to scriptX.pl - all of them.
    BEGIN { use lib File::Spec->catdir($Bin,'LIB'); }
    

    下侧1:您需要编辑每个脚本。 下侧2:您需要知道每个脚本中“$ Bin”的位置。