gpt4 book ai didi

perl - 将模块目录添加到@INC

转载 作者:行者123 更新时间:2023-12-02 21:37:17 26 4
gpt4 key购买 nike

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

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"

最佳答案

不清楚你在哪里操纵@INC,但从我阅读你问题的方式来看,你似乎是在 script.pl 中完成的。

简单地更改父脚本的@INC不会影响通过system()调用的脚本的@INC > 调用,因为这些子脚本将有自己的 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";

    优点:您只需将代码放入 1 个脚本(父脚本)中。

    因此,这是我推荐的解决方案。

  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”在每个脚本中的位置。

关于perl - 将模块目录添加到@INC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com