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;
}

上記のことがもっと簡単にできることを知りたいです。(libなしおよびlibコマンドを使用)を使用するには、Perlモジュールを含める必要がありますか?これは、複数の環境でスクリプトが実行されているための要件であり、環境の1つがダウンすると、スクリプトの実行が停止します。私はこれを達成するために、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 は の内容を調べます@INCPerlvarはそれについて次のように述べています。

配列 @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/libますthird/lib。他に何もする必要はありません。

-- 別の注意点として、上記のコードではコンパイル時と実行時が混在しています。3 つのuse部分とBEGINブロックは、構成に関係なくコンパイル時に呼び出されますif。呼び出しを含む他のすべてはno lib、一致が true の場合にのみ実行時に呼び出されます。これがどのように機能するかについてのより詳細な説明については、perlmodを参照してください。

于 2012-12-20T08:26:57.013 に答える