2014-01-13 33 views
2

我有一大堆的腳本,我需要在連續的方式類似的財產以後的運行它們下面添加模塊目錄到@INC

foreach my (qw (script1.pl script2.pl script3.pl){ 

my $script=File::Spec->catfile($Bin,'Scripts',$_); 
system "$^X $script"; 
} 

每這些腳本使用2個模塊,這些模塊在lib庫所在的位置腳本發現即

我有項目庫,它contian上述腳本和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" 
+3

請提供完整的錯誤信息和您嘗試加載的模塊的完整路徑。 (您可以根據需要替換私人信息,只需要保持一致,例如,將公司名稱替換​​爲「xxx」,將用戶名替換爲「yyy」。) – ikegami

+0

「Porject \ LIB」中的Detection.pm? – DVK

+0

是的,如果我打印File :: Spec-> catdir($ Bin,'LIB'),我可以看到它在正確的目錄 – smith

回答

5

錯誤的位置你manipullating @INC,但我看了你的問題的方式,看來你在script.pl做到了目前尚不清楚。

簡單地改變父腳本@INC不會影響您通過電話system()調用腳本@INC,因爲這些孩子scrips都會有自己的Perl解釋器的副本。

您需要在被調用的腳本(script1.pl,script2.pl,script3.pl)中對其進行操作。只有您:

你可以做的3種方式是1:

  1. 通過添加調用從script.pl腳本的時候 「-I」 的Perl參數:

    my $lib_path = File::Spec->catdir($Bin,'LIB'); 
    system "$^X -I $lib_path $script"; 
    

    優勢將代碼放在1個腳本(父代)中。

    因此,這是我會推薦的解決方案。

  2. 通過讓script1.pl(和2和3)根據腳本路徑調整自己的@INC

    例如:

    use Cwd qw(abs_path); 
    use FindBin; 
    use lib abs_path("$FindBin::Bin/../LIB"); 
    

    效益:你不需要知道ehere 「$彬」 是。 缺點:您需要編輯每個腳本。

  3. 通過具有script1.pl(2和3)調整自身@INC根據你試圖投入父腳本邏輯:

    # Add to scriptX.pl - all of them. 
    BEGIN { use lib File::Spec->catdir($Bin,'LIB'); } 
    

    下行1:你需要編輯每個人的腳本。 缺點2:您需要知道每個腳本中的「$ Bin」。