3

目前,我正在尝试在带有 WebUI 的 Perl 程序中使用一堆自定义 perl 模块, test.pm 作为其中之一。我在安装了 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 路径吗?

另外添加 use 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 扩展,向有类似问题的人展示如何添加更多模块文件夹。)

4

2 回答 2

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'.

于 2012-06-14T00:46:20.127 回答
1

如果您可以在安装文件中添加,则使用 lib很好,否则您必须在每个 perl 脚本文件中添加它。您可以使用PERL5LIB环境变量而不是这样做。

perl 中的@INC不获取PATH环境变量的值,而是可以从PERL5LIB环境变量中获取。

您可以SetEnv PERL5LIB path_to_modules_directory在 apache 配置中添加指令。执行 perl 脚本时,您的 perl 脚本会将此路径添加到原始@INC值的前面。

于 2012-06-14T10:04:53.593 回答