目前,我正在尝试使用一堆自定义的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";
}
在 path 变量下,我确实看到了所有模块所在的文件夹。我应该用别的地方来添加到Perl Path吗?
此外,在我的代码中添加使用库"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 扩展,向有类似问题的人展示如何添加更多模块文件夹。
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'
.
如果可以添加安装程序文件,则使用lib是很好的,否则您必须将其添加到每个perl脚本文件中。您可以使用环境变量PERL5LIB
而不是这样做。Perl 中的@INC不获取 PATH 环境变量的值,而是可以从环境变量中获取PERL5LIB值。
您可以在 apache 配置中添加SetEnv PERL5LIB path_to_modules_directory
指令。在执行perl脚本时,您的perl脚本将在原始@INC值的前面添加此路径。