我有一堆脚本需要以顺序方式运行它们,如下所示
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"
答案 0 :(得分:5)
目前还不清楚你在哪里操纵@INC
,但是我读你的问题的方式,似乎是你在script.pl中做到的。
简单地更改父级脚本的@INC
将不会影响您通过@INC
来电调用的脚本system()
,因为这些孩子的脚本将拥有自己的副本Perl翻译。
您需要在被调用的脚本中操作它(script1.pl,script2.pl,script3.pl)。
您可以通过以下三种方式之一完成:
通过从script.pl:
调用脚本时添加“-I”Perl参数my $lib_path = File::Spec->catdir($Bin,'LIB');
system "$^X -I $lib_path $script";
好处:您只将代码放在一个脚本中(父代一个)。
因此,这是我建议的解决方案。
让script1.pl(和2和3)根据脚本路径调整自己的@INC
。
例如:
use Cwd qw(abs_path);
use FindBin;
use lib abs_path("$FindBin::Bin/../LIB");
好处:你不需要知道“$ Bin”。 下行:您需要编辑每个脚本。
让script1.pl(和2和3)根据您尝试放入父脚本的逻辑调整自己的@INC
:
# Add to scriptX.pl - all of them.
BEGIN { use lib File::Spec->catdir($Bin,'LIB'); }
下侧1:您需要编辑每个脚本。 下侧2:您需要知道每个脚本中“$ Bin”的位置。