【问题标题】:How can I load a Perl module from a relative path in IIS6?如何从 IIS6 中的相对路径加载 Perl 模块?
【发布时间】:2010-05-27 05:56:38
【问题描述】:

我正在使用从 IIS 6 中的 CGI scipt 调用的 Perl 模块,该模块正在轰炸。 XP 机器 (IIS 5.1) 上相同的文件夹结构非常有效。如果我在第 9 行删除模块加载命令,它会打印“即将加载”和“ok”,但是当我尝试运行时

use Language::Guess;

我收到了

指定的 CGI 应用程序 不返回完整的行为不端 一组 HTTP 标头。

在浏览器中。

文件夹结构是 /cgi-bin/test.pl /PerlModules/Language/Guess.pm

我已尝试调整文件/文件夹权限,并反复检查了我的 IIS 配置。它可以从 IIS 机器上的命令行正常运行,或者如果我将模块复制到 \Perl\site\lib 中,但我无权在此脚本的目标共享服务器上加载模块。我错过了一些简单的东西吗?

这里是 test.pl

use strict;
use CGI ':standard';

print header("text/html");

use lib "..\\PerlModules\\"; 
print "about to load<br/>";
#bombs here
use Language::Guess;

print "ok"

【问题讨论】:

  • 编辑问题让它自己回答很奇怪。

标签: perl iis-6 module


【解决方案1】:

问题是线

use lib "..\\PerlModules\\";

将其更改为 Perl 模块所在位置的完整路径:

use lib "C:\\Perl\\PerlModules\\";

或其他。

原因是您的 CGI 脚本在同一目录中从命令行运行是可以的,但是当服务器从不同目录以绝对路径运行它时,目录 ..\\PerlModules\\ 不再是正确的位置的模块(因为现在 .. 是相对于服务器的目录,而不是你的脚本的)。当它尝试加载模块时,它找不到它并打印一条错误消息。 Web服务器无法处理错误信息,所以你得到了上面的。

如果您不想在 cgi 脚本中使用绝对路径,请在带有 FindBin 模块的 BEGIN 块内使用 use lib 进行调查。

缓解此类问题的一个方法是 CGI::Carp 模块及其“fatalsToBrowser”选项:

 use CGI::Carp 'fatalsToBrowser';

捕捉错误并将它们扔给浏览器。不过,这仅用于调试。

【讨论】:

  • 关于 CGI::Carp 模块的重要提示。根据您的回答,最终代码是使用 FindBin;使用库 "$FindBin::Bin/../PerlModules";
  • 那是BEGIN { }; 不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多