目前我正在尝试使用一堆自定义perl模块,test.pm作为其中之一,在我的Perl程序中使用WebUI。我在安装了Apache2的Windows 7机器上运行它。当我使用perl test.pl在cmd提示符下运行程序时,程序运行正常。但是在Apache上运行它会给我带来这个错误。
[Wed Jun 13 16:23:32 2012] [error] [client 127.0.0.1] Can't locate test.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at C:/www/hello2.pl line 7.\r, referer: http://localhost/ui_test.htm
[Wed Jun 13 16:23:32 2012] [error] [client 127.0.0.1] BEGIN failed--compilation aborted at C:/www/hello2.pl line 7.\r, referer: http://localhost/ui_test.htm
我用过:
foreach $key (sort keys(%ENV)) {
print "$key = $ENV{$key}<p> \n";
}
在路径变量下,我确实看到了所有模块所在的文件夹。我还应该在其他地方添加到Perl Path吗?
另外添加使用lib“C:\ testpm \”;我的代码只将@INC更改为
(@INC contains: C:\testpm\ C:/Perl/lib C:/Perl/site/lib .)
在apache服务器上添加路径以运行自定义perl模块需要做些什么吗?
基于答案的解决方案: 我发现这是最好的。在我的httpd-perl.conf文件中,我添加了这些行:
<IfModule env_module>
SetEnv PERL5LIB "C:\testpm;C:\testpm1;"
</IfModule>
(扩展为C:\ testpm1,向人们展示如何添加更多模块文件夹的类似问题。)
答案 0 :(得分:3)
PATH环境变量与perl将从中加载模块的位置无关,即@INC。你说你的路径在@INC中,但在你显示的错误信息中,它不是。
Can't locate test.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at
您应该在服务器启动期间调用use lib
。请参阅http://perl.apache.org/docs/2.0/user/handlers/server.html#Startup_File。
另外,请尝试删除尾部斜杠,例如use lib 'C:\testpm'
。
答案 1 :(得分:1)
使用lib 是好的,如果你可以添加安装文件,否则你将不得不在每个perl脚本文件中添加它。比这样,你可以使用 PERL5LIB 环境变量。
perl中的@INC 不接受 PATH 环境变量的值,而是可以从 PERL5LIB 环境变量中获取。
您可以在apache配置中添加SetEnv PERL5LIB path_to_modules_directory
指令。您的perl脚本会在执行perl脚本时在原始 @INC 值前面添加此路径。