perl需要变量给出的文件

时间:2011-04-26 12:28:01

标签: perl require

我想使用一个模块,文件的路径将在变量中。

我尝试使用此代码:

#!/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"

2 个答案:

答案 0 :(得分: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,这样它也会在那里查找Error.pm:

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

或者您可以从调用AidClass的脚本执行此操作,而不是调用use Error;调用use AidClass;,如果Error.pm在文件夹中,它将正常工作。

答案 1 :(得分:2)

你没有说它“不起作用”的方式,所以这只是一个猜测。

您是否尝试过阅读documentation?特别是讨论使用变量加载模块的那个。

  

如果EXPR是一个单词,则需要   假设“.pm”扩展名并替换   文件名中带有“/”的“::”,   使标准加载变得容易   模块。这种形式的装载   模块不会冒险改变你的   命名空间。

     

换句话说,如果你试试这个:

require Foo::Bar; # a splendid bareword
     

实际上需要函数   在中寻找“Foo / Bar.pm”文件   @INC中指定的目录   阵列。

     

但如果你试试这个:

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

require函数将查找   @INC数组中的“Foo :: Bar”文件   会抱怨找不到   那里有“Foo :: Bar”。在这种情况下你可以   做:

eval "require $class";