Perl模块缺少错误

时间:2012-09-25 01:54:03

标签: perl perl-module

我是一个学习perl并且正常工作的新人。我真的陷入了困境,在过去的4小时里一直在研究这件事而没有任何结果。

我在目录中使用了一堆自定义模块,然后我获得了实现新知识库的票证,因此我在Moduledirectory中添加了一个新模块。添加后,当我尝试访问MyModule时,它根本不起作用。我得到了

Can't locate FolderName/MyModuleName.pm in @INC 

有人可以帮助我。这真的很烦人。我试图重启apache服务器,但仍然出现相同的错误。

我也尝试编译我的模块,但是我得到了同样的错误,除了模块的名称不同,它是我在MyModule中调用/使用的那个。

如果你能帮助我,请告诉我。提前谢谢。

编辑:添加更多详细信息,我得到的确切错误(包含可读性的换行符)是:

Can't locate Net2Net/KnowledgeBase.pm in @INC (@INC contains:
    (DOCUMENT_ROOT)/bin 
    /usr/local/lib/perl5/5.8.8/sun4-solaris
    /usr/local/lib/perl5/5.8.8
    /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris
    /usr/local/lib/perl5/site_perl/5.8.8
    /usr/local/lib/perl5/site_perl
    .
) at /data1/web/intradev.com-80/docs/gss/kb/ajax-kb-update.cgi line 6.
BEGIN failed--compilation aborted at /data1/web/intradev.com-80/docs/gss/kb/ajax-kb-update.cgi line 6.

2 个答案:

答案 0 :(得分:7)

错误消息说明了一切......

您的自定义模块安装在哪里?

Perl使用名为@INC的数组来跟踪搜索Perl模块的目录。如果在命令行键入perl -V,您将看到@INC目录的默认列表。您可以将模块放在@INC列表中的一个目录中。您还可以使用use lib; pragma将目录添加到@INC。这需要在您的Perl源代码中。

大多数@INC列表包含当前目录,因此您通常可以在其中粘贴模块。但是,在Apache或perl_mod中作为CGI脚本运行?最好的办法是使用use Cwd;模块查看当前目录是什么。 CGI可能会删除某些环境变量作为安全措施。

还有一件事。如果Perl模块为Foo::Bar,则模块在Foo/Bar.pm目录列表下的某个目录下的某个位置@INC。如果是Foo::Bar::Foom,则会引用模块Foo/Bar/Foom.pm。有些人只是复制没有目录的模块。

答案 1 :(得分:1)

该文件位于

/data1/web/intradev.com-80/docs/bin/Net2Net/KnowledgeBase.pm 

但Perl搜索以下位置(假设cwd为/,这可能是apache下的CGI):

/(DOCUMENT_ROOT)/bin/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/5.8.8/sun4-solaris/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/5.8.8/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/5.8.8/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/Net2Net/KnowledgeBase.pm 
/Net2Net/KnowledgeBase.pm

因此,Perl找不到它。你必须告诉它看看

/data1/web/intradev.com-80/docs/bin

您可以通过添加

来实现
use lib '/data1/web/intradev.com-80/docs/bin';

.cgi。 (其他方式包括使用-I命令行选项和env var PERL5LIB。请参阅perlrun。)看起来有人试图这样做(或等效),但实际上搞砸了(相当于)

use lib '(DOCUMENT_ROOT)/bin';   # Wrong!

如果您想使用相对路径,以下内容也适用:

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

use lib dirname(realpath($0)).'/../../bin';