如何在PERL中使用no lib命令更改@INC lib内容

时间:2012-12-20 07:40:32

标签: perl

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}}值相同。希望以上内容为您的理解增添一些清晰度。感谢。

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/libthird/lib。你不需要做任何其他事情。

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