Perl模块丢失错误

Perl模块丢失错误,perl,perl-module,Perl,Perl Module,我是一个新的学习perl的人,并且一直在工作。我真的被困在这一点上,在过去的4个小时里一直在做这件事,没有任何结果 我在一个目录中使用了一堆自定义模块,然后我得到了一张实现新知识库的票证,因此我在Moduledirectory中添加了一个新模块。添加后,当我尝试访问MyModule时,它根本不起作用。我明白了 Can't locate FolderName/MyModuleName.pm in @INC 谁能帮帮我吗。这真的很烦人。我尝试重新启动apache服务器,但仍然出现相同的错误 我也

我是一个新的学习perl的人,并且一直在工作。我真的被困在这一点上,在过去的4个小时里一直在做这件事,没有任何结果

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

Can't locate FolderName/MyModuleName.pm in @INC 
谁能帮帮我吗。这真的很烦人。我尝试重新启动apache服务器,但仍然出现相同的错误

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

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

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


错误消息说明了一切

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

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

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

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

文件位于

/data1/web/intradev.com-80/docs/bin/Net2Net/KnowledgeBase.pm 
但是Perl搜索以下位置(假设cwd是
/
,这可能是apache下的CGI):

因此,Perl无法找到它。你得让它进去看看

/data1/web/intradev.com-80/docs/bin
您可以通过添加

use lib '/data1/web/intradev.com-80/docs/bin';
到您的
.cgi
。(其他方法包括使用
-I
命令行选项和env var
PERL5LIB
。请参见。)看起来好像有人试图这么做(或等效),但做(等效的)


如果要使用相对路径,以下操作也可以:

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

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

错误消息的其余部分是什么?模块的完整路径是什么。运行apache进程的用户是否有足够的权限访问这些文件以及指向该文件的目录?我已经添加了完整的错误消息,错误消息中包含了完整的路径。我仔细检查了文件以及包含文件的文件夹是否具有运行apache的用户(https)的写入/执行权限。到
KnowledgeBase.pm
的完整路径是什么?这实际上是在说“(DOCUMENT_ROOT)”,还是在隐藏敏感数据?(如果你这样做了也没关系,但我需要知道它是哪一个。最好通过将敏感词更改为另一个来隐藏敏感数据。)不,它不是替代品,该网站托管在Sun服务器上,目录结构就是这样,文件的原始路径是/data1/web/intradev.com-80/docs/bin/Net2Net/KnowledgeBase.pm非常感谢您在我替换use lib'(DOCUMENT_ROOT)/bin'时提供的帮助;使用lib'/data1/web/intradev.com-80/docs/bin';它对我来说非常有效。@Parikshit Tiwari,web服务器可能会将文档根作为env变量提供。如果是这样,您可以使用库“$env{document_root}/bin”

use lib '/data1/web/intradev.com-80/docs/bin';
use lib '(DOCUMENT_ROOT)/bin';   # Wrong!
use Cwd            qw( realpath );
use File::Basename qw( dirname );

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