2012-04-01 48 views
2

我想知道如何在我的perl設置中添加一個新目錄以搜索要包含的模塊?如何編輯@INC條目以包含模塊的新目錄

當我跑這條線:

perl -w /var/www/cgi-bin/upload.cgi 

我收到以下錯誤:

Can't locate config.pm in @INC (@INC contains: . /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8) at /var/www/cgi-bin/upload.cgi line 5. 
BEGIN failed--compilation aborted at /var/www/cgi-bin/upload.cgi line 5. 

而且我搜索谷歌,顯然我應該包括/var/www/cgi-bin作爲一個文件夾,以便Perl可以找到它,幷包括它。

更多信息

以下是該計劃的頭幾行:

use strict; 
use lib '.'; 
use XFSConfig; #this was fixed by using -I command line switch 
use XUpload; # this returns as an error!!! 
use CGI::Carp qw(fatalsToBrowser); 
use CGI; 
use LWP::UserAgent; 
+0

什麼是config.pm?我沒有看到前幾行。 XUpload相對於你的程序在哪裏? – 2012-04-01 21:20:05

+0

以及我試圖將XFSConfig重命名爲Config,認爲它可以修復它,但上面是在我的其他服務器上運行的原始未觸動的程序,沒有問題!相對於我的程序,XUpload位於名爲「模塊」的文件夾中。所以它位於@「/ var/www/cgi-bin/Modules /」 – 2012-04-01 21:39:20

+0

所以就像我在我的回答中所說的那樣,'使用lib dirname(realpath($ 0))。'/ Modules';' – ikegami 2012-04-01 23:23:21

回答

5

有幾種方法,其中許多是覆蓋在perlfaq8: How do I add a directory to my include path at runtime?

1)使用-I命令線路開關

perl -w -I/var/www/cgi-bin /var/www/cgi-bin/upload.cgi 

2)使用PERLLIBPERL5LIB環境變量

export PERLLIB="$PERLLIB:/var/www/cgi-bin" 
perl -w /var/www/cgi-bin/upload.cgi 

PERL5LIB="$PERL5LIB:/var/www/cgi-bin" perl -w /var/www/cgi-bin/upload.cgi 

3)使用lib編譯代碼中的

# somewhere near the top of /var/www/cgi-bin/upload.cgi 
use strict; 
use warnings; 
use lib '/var/www/cgi-bin'; 
+0

我使用了方法1,現在我得到了另一個錯誤,並且perl無法找到我想要包含在程序中的第二個文件,現在我已經在問題中包含了我的cgi文件的頭文件,任何幫助將不勝感激! – 2012-04-01 20:14:51

+3

如果你有一個CGI程序並使用類似.htaccess的東西,請使用#2。否則,使用#3 – 2012-04-01 21:18:47

1

最簡單的是mylib

use mylib; 

它在相對於腳本的名爲lib /和../lib/的目錄中搜索。它正確處理符號鏈接。


如果您需要更大的靈活性,您可以使用lib

use lib $lib_dir; 

這是一樣的

BEGIN { unshift @INC, $lib_dir; } 

例如,尋找到同一個目錄的腳本中,你可以使用

use Cwd   qw(realpath); 
use File::Basename qw(dirname); 

use lib dirname(realpath($0)); 

您也可以提供它在command line

perl -I$lib_dir script.pl 

最後,如果你想全局設置,您可以在您的登錄腳本設置環境變量PERL5LIB

export PERL5LIB=$lib_dir 

(用有問題的路徑替換$lib_dir。)

0

問題很可能是您沒有正確拼寫Config。它以大寫C開頭,如果發現錯誤,Perl將找不到該模塊。

默認情況下,@INC包含. - Perl程序的當前工作目錄 - 作爲其最後一項,所以Perl程序通常會查找與源文件相同的目錄中的文件作爲最後的手段。

Config是在創建Perl副本時創建的標準模塊。它包含構建的所有參數。它不應該在標準庫文件夾之外找到。

+1

大多數CGI腳本都是以「'/'」作爲當前目錄執行的,所以「'。」「對他們來說是沒用的。 – ikegami 2012-04-01 20:07:34

+2

有些東西告訴我他不想要* perl' *的配置。他絕對不應該創建一個名爲'Config'的模塊。 – ikegami 2012-04-01 20:11:25

相關問題