2011-04-26 47 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";