2011-04-26 49 views
2

我想使用一個模塊,該文件的路徑將在一個變量中。perl需要變量給出的文件

我嘗試使用此代碼:

#!/usr/bin/perl -w 
use strict; 

use Getopt::Long; 

my ($library, $zipped, $aid_class_file); 
GetOptions ("aid_class_file=s" => \$aid_class_file, 
      "res_lib=s"   => \$library, 
      "zip"    => \$zipped); 

require $aid_class_file; 

,但它不工作。我該怎麼做?

編輯: 的錯誤信息是:

Can't locate Error.pm in @INC (@INC contains: /usr/lib/perl5/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl .) at /nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm line 6. 
BEGIN failed--compilation aborted at /nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm line 6. 
Compilation failed in require at statistics.pl line 11. 

我要添加的文件名爲AidClass.pm,而不是Error.pm

我跑使用線路:

statistics.pl -aid_class_file="/nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm" 
+3

它是如何失敗的? – Hasturkun 2011-04-26 12:35:07

+0

@Prix,你是對的,thnx.write它作爲答案,以便我可以接受它。 – SIMEL 2011-04-26 13:13:18

+0

@llya希望你的問題得到解決:) – Prix 2011-04-26 15:09:30

回答

3

你的錯誤表明,AidClass無法找到,導致其崩潰Error.pm文件。該Error.pm被稱爲在AidClass.pm的第6行:

Can't locate Error.pm

它尋找它的以下路徑:

/usr/lib/perl5/5.8.3/x86_64-linux-thread-multi 
/usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/x86_64-linux-thread-multi 
/usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl 
/usr/lib/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi 
/usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl 

根據您的AidClass怎麼又是你可以添加其目錄作爲AidClass.pm中的lib,因此它將查找錯誤。下午在那裏還有:

use lib '/nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/'; 
use Error; 

或者你可以做到這一點從腳本您所呼叫AidClass和而不是調用use Error;呼叫use AidClass;如果Error.pm是在文件夾內,將工作得很好。

2

你不要說它以什麼方式「不起作用」,所以這都是一個猜測。

您是否試過閱讀documentation?特別是關於使用變量加載模塊的位。

如果EXPR是一個裸字,則需要 假定「的.pm」擴展名和文件名替換 ‘::’與‘/’你, ,以方便裝載標準 模塊。這種形式的 模塊加載不會改變您的 命名空間。

換句話說,如果你試試這個:

require Foo::Bar; # a splendid bareword 

的需要功能實際上 尋找在@INC 數組中指定的 目錄「美孚/ Bar.pm」文件。

但如果你試試這個:

$class = 'Foo::Bar'; 
require $class; # $class is not a bareword 
#or 
require "Foo::Bar"; # not a bareword because of the "" 

require函數將尋找@INC數組在 「富::酒吧」文件和 會抱怨找不到 「富::酒吧「 那裏。在這種情況下,你可以做 :

eval "require $class";