我是一个学习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.
答案 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';