if (@arr =~ /env1/) #checking enviroment
{
# Want to flush the @INC contents using below no lib
# --> Command before the perl get the libraries of my choice at the time of compilation
no lib "//First/lib/"; #flush INC
no lib "//Second/lib/"; #flush INC
print log1 "INC before current- @INC\n";
#set library of my choice with either syntax
BEGIN{ unshift @INC, "//Third/lib/" };
# or
use lib "//third/lib/";
print log1 "INC after- @INC\n";
print log2 "INC after- %INC\n";
print log3 map {"$_ => $INC{$_}\n"} keys %INC;
use DirHandle;
use File::Find;
use File::Copy;
print map {"$_ => $INC{$_}\n"} keys %INC;
}
我想知道上面的事情可以用更简单的方式实现。我是否需要包含任何Perl模块才能使用(无lib和使用lib命令)。这是一个要求,因为脚本在多个环境中运行,当其中一个环境停止运行时,脚本停止运行。我希望通过传递我选择的库来实现这一目标。
欢迎提出建议。
修改 这是实际的代码。
if (@temp[arr_index]=~ /env1/) #enviroment 1
{
BEGIN{ unshift @INC, "//server1/lib/" }; #server 1 for same app lower enviroment 1
BEGIN{ unshift @INC, "//server2/lib/" }; #server 2 for same app lower enviroment 1
use File::Copy;
}
elsif (@temp[arr_index]=~ /env2/) #enviroment 2
{
BEGIN{ unshift @INC, "//server1/lib/" }; #server 1 for same app lower enviroment 2
BEGIN{ unshift @INC, "//server2/lib/" }; #server 2 for same app lower enviroment 2
use File::Copy;
}
elsif (@temp[arr_index]=~ /env3/) #enviroment 3
{
BEGIN{ unshift @INC, "//server1/lib/" }; #server 1 for same app lower enviroment 3
BEGIN{ unshift @INC, "//server2/lib/" }; #server 2 for same app lower enviroment 3
use File::Copy;
}
@INC
- @INC
导致问题的所有环境的{{1}}值相同。希望以上内容为您的理解增添一些清晰度。感谢。
答案 0 :(得分:0)
我建议您按照首选环境的顺序将所有这些内容推送到@INC
。 Perl将查看@INC
的内容。 Perlvar对此说:
数组@INC包含EXPR,require所需的位置列表, 或使用构造查找其库文件。
这意味着它将查看从左到右的路径列表,如here所述。因此,您可以将库路径一个接一个地推送到@INC
:
@!/usr/bin/perl
use strict;
use warnings;
BEGIN {
use lib 'first/lib', 'second/lib', 'third/lib';
}
如果你现在去require Some::Module
,Perl会首先查看first/lib
。如果它找不到它,可能是因为你的环境中不存在路径(它不会抱怨),Perl将继续一个接一个地查看second/lib
和third/lib
。你不需要做任何其他事情。
-
另外,在上面的代码中,你有很多混合编译时间和运行时间。在编译时将调用三个use
部分和BEGIN
块,而不管它们所在的if
构造。其他所有内容,包括no lib
调用都只会被调用在运行时,如果匹配为真。有关其工作原理的详细说明,请参阅perlmod。