【问题标题】:how to edit @INC entry to include a new directory for modules如何编辑 @INC 条目以包含模块的新目录
【发布时间】:2012-04-01 19:40:08
【问题描述】:

我想知道如何在我的 perl 设置中添加一个新目录来搜索要包含的模块?

当我运行这一行时:

perl -w /var/www/cgi-bin/upload.cgi

我收到以下错误:

Can't locate config.pm in @INC (@INC contains: . /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8) at /var/www/cgi-bin/upload.cgi line 5.
BEGIN failed--compilation aborted at /var/www/cgi-bin/upload.cgi line 5.

我搜索了 Google,显然我应该将 /var/www/cgi-bin 包含为一个文件夹,以便 Perl 可以找到并包含它。

更多信息

这是程序的前几行:

use strict;
use lib '.';
use XFSConfig; #this was fixed by using -I command line switch
use XUpload; # this returns as an error!!!
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use LWP::UserAgent;

【问题讨论】:

  • 什么是config.pm?我在前几行中没有看到这一点。 XUpload 相对于你的程序在哪里?
  • 好吧,我尝试将 XFSConfig 重命名为 Config 以为它会修复它,但上面是在我的其他服务器上运行的原始未触及程序,没有问题!!! XUpload 相对于我的程序位于一个名为“Modules”的文件夹中。所以它位于@"/var/www/cgi-bin/Modules/"
  • 就像我在回答中所说的那样,use lib dirname(realpath($0)).'/Modules';

标签: linux perl apache cgi centos


【解决方案1】:

有几种方法,其中很多都在perlfaq8: How do I add a directory to my include path at runtime?中介绍过

1) 使用-I 命令行开关

perl -w -I/var/www/cgi-bin /var/www/cgi-bin/upload.cgi

2) 使用PERLLIBPERL5LIB 环境变量

export PERLLIB="$PERLLIB:/var/www/cgi-bin"
perl -w /var/www/cgi-bin/upload.cgi

PERL5LIB="$PERL5LIB:/var/www/cgi-bin" perl -w /var/www/cgi-bin/upload.cgi

3) 在您的代码中使用lib pragma

# somewhere near the top of  /var/www/cgi-bin/upload.cgi
use strict;
use warnings;
use lib '/var/www/cgi-bin';

【讨论】:

  • 我使用了方法 1,现在又出现了一个错误,perl 找不到我想包含在程序中的第二个文件,我现在已经在问题中包含了我的 cgi 文件的标题,任何帮助将不胜感激!
  • 如果你有一个 CGI 程序并且可以使用 .htaccess 之类的东西,请使用 #2。否则,使用#3
【解决方案2】:

最简单的是mylib

use mylib;

它在相对于脚本的名为 lib/ 和 ../lib/ 的目录中进行搜索。它正确处理符号链接。


如果您需要更大的灵活性,可以使用lib

use lib $lib_dir;

与此相同

BEGIN { unshift @INC, $lib_dir; }

例如,要查看与脚本相同的目录,您可以使用

use Cwd            qw( realpath );
use File::Basename qw( dirname );

use lib dirname(realpath($0));

您也可以在command line 上提供。

perl -I$lib_dir script.pl

最后,如果要全局设置,可以在登录脚本中设置环境变量PERL5LIB

export PERL5LIB=$lib_dir

(将$lib_dir 替换为相关路径。)

【讨论】:

    【解决方案3】:

    问题很可能是您没有正确拼写Config。它以大写 C 开头,如果你弄错了,Perl 将找不到该模块。

    默认情况下,@INC 包含 . - Perl 程序的当前工作目录 - 作为它的最后一个条目,因此 Perl 程序通常会在与源文件相同的目录中查找文件作为最后的手段。

    Config 是一个标准模块,在构建 Perl 副本时创建。它包含构建的所有参数。永远不要在标准库文件夹之外找到它。

    【讨论】:

    • 大部分CGI脚本都是以“/”为当前目录执行的,所以“.”对他们来说是无用的。
    • 有件事告诉我他不想要 perl 的配置。他绝对不应该创建一个名为Config 的模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多