0
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 命令)。这是一个要求,因为脚本在多个环境中运行,并且当其中一个环境关闭时,脚本将停止运行。我想通过传递我选择的库供 perl 使用来实现这一点。

欢迎提出建议。


编辑: 这是实际的代码。

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对于导致问题的所有环境具有相同的值。希望以上内容能让您的理解更加清晰。谢谢。

4

1 回答 1

0

我建议@INC按照您喜欢的环境的顺序将它们全部推入。Perl 将查看@INC. Perlvar说:

数组 @INC 包含 do EXPR 、 require 或 use 构造查找其库文件的位置列表。

这意味着它将查看从左到右的路径列表,如此处所述。因此,您可以将您的库路径@INC一个接一个地推入:

@!/usr/bin/perl
use strict;
use warnings;

BEGIN {
  use lib 'first/lib', 'second/lib', 'third/lib';
}

如果你现在去 and require Some::Module,Perl 将first/lib首先查找。如果它在那里找不到它,可能是因为你的环境中不存在该路径(它不会抱怨),Perl 将继续查找second/libthird/lib一个接一个。你不必做任何其他事情。

- 另一方面,您在上面的代码中混合了很多编译时间和运行时间。这三个use部分和BEGIN块将在编译时调用,而不管if它们所在的构造。其他所有内容,包括no lib调用,只有在匹配为真时才会在运行时调用。有关其工作原理的更详细说明,请参见perlmod 。

于 2012-12-20T08:26:57.013 回答