gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:39:52 24 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)中对其进行操作。

您可以通过以下 3 种方式中的一种来实现:

  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/

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