-3

我是一个新人,学习 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.
4

2 回答 2

7

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

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

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

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

还有一件事。如果 Perl 模块是Foo::Bar,则该模块位于目录列表Foo/Bar.pm下的某个目录下@INC。如果是Foo::Bar::Foom,它指的是模块Foo/Bar/Foom.pm。有些人只是复制没有目录的模块。

于 2012-09-25T02:09:22.280 回答
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';
于 2012-09-25T18:26:49.360 回答