0

我第一次尝试在 Ubuntu 上使用 -> Apache - Perl (CGI) 。

Apache 服务器在/var/www默认index.html文件的文件夹中工作正常。但由于我想运行 CGI 脚本,我还安装了(以防万一)DBI,正如一些论坛所建议的那样。我设置了对脚本所在cgi-bin文件夹的完全访问权限。select.cgi我尝试多次调整select.cgi脚本,将库重定向到 Perl 库,但无济于事。我修改了httpd.conf文件并将目录路径设置为select.cgi文件夹。那没有用。我还定义ScriptAlias了 ,并将其设置为工作目录。那也没有用。有没有人有任何有用的指示。谢谢。

4

2 回答 2

4

这不是您想要的确切解决方案,但总体思路如下。

如何解决Cant locate xxxx.pm in @INC path问题

默认情况下,perl 在标准库路径和当前目录中查找模块。有时您需要使用一些安装在非标准位置的模块;有几种方法可以处理这种情况:

检查您的模块是否在@INC路径中使用。

例子:

perl -e 'use SOAP::Lite;'
perl -e 'use Error;'

SOAP::Lite如果您在已安装并已安装的系统上运行这些命令Error,Perl 将简单地从这些命令返回而不打印任何输出。

要检查当前的标准库路径,请使用:

perl -le 'print foreach @INC'

如果您具有管理权限,那么最好的解决方案是将模块安装在任何系统定义的库路径中。

设置环境变量PERL5LIB Perl 会先在PERL5LIB环境变量中指定的目录中查找模块,然后再查找标准库和当前目录。所以你可以设置这个变量来定位你的模块。

例子:

# For unix like systems
PERL5LIB=/home/path/lib:/usr/another/path/lib; export PERL5LIB

注意:在 unix 上用冒号分隔目录,在 Windows 上用分号分隔。

如果您从命令行运行代码,则使用-I参数。语法应该类似于。

perl -I /home/path/lib -I /usr/another/lib script.pl

您还可以在脚本中添加库路径

在脚本中包含路径的命令是: use lib path

例子:

#!/usr/bin/perl
use lib "/home/path/lib";
use lib "/usr/another/lib";

use MyCustomModule;
于 2012-09-14T07:21:59.680 回答
1

在评论中,您提供的信息与您最初提供的信息相矛盾。后面的信息似乎更可靠,所以我会使用它。

我相信你说模块的路径是

/usr/lib/perl5/vendor_perl/5.8.5/foo/bar/Connection.pm

并且您收到的错误消息(添加了换行符)是:

Can't locate foo/bar/Connection.pm in @INC (@INC contains:
   /etc/perl
   /usr/local/lib/perl/5.14.2
   /usr/local/share/perl/5.14.2
   /usr/lib/perl5
   /usr/share/perl5 
   /usr/lib/perl/5.14
   /usr/share/perl/5.14
   /usr/local/lib/site_perl
   .
   /usr/lib/perl5/vendor_perl/5.8.5/foo/bar/
) at ...

你做了类似的事情

use foo::bar::Connection;

或者

require "foo/bar/Connection.pm";

Perl 寻找

  • /etc/perl/foo/bar/Connection.pm
  • /usr/local/lib/perl/5.14.2/foo/bar/Connection.pm
  • ...
  • /usr/lib/perl5/vendor_perl/5.8.5/foo/bar/foo/bar/Connection.pm

但这些都不是

/usr/lib/perl5/vendor_perl/5.8.5/foo/bar/Connection.pm

修复很简单。将以下内容添加到您的脚本中:

use lib '/usr/lib/perl5/vendor_perl/5.8.5'; 

另一个可能的解决方法是使用

 use Connection;

代替

 use foo::bar::Connection;

哪个修复是正确的修复取决于package模块侧面的那条线的样子。如果找到package foo::bar::Connection;,则需要修改@INC(如use lib, for example). If you find包 Connection 所示;, you need to change the使用`指令。

于 2012-09-14T21:25:48.253 回答