如何编辑@INC条目以包含一个新的模块目录

3
我想知道如何在我的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.

我在谷歌上搜索,发现我应该将/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相对于您的程序在哪里? - brian d foy
我试图将XFSConfig重命名为Config,以为这样可以解决问题,但上面是原始未经修改的程序,在我的其他服务器上运行没有任何问题!!! XUpload位于名为“Modules”的文件夹中,相对于我的程序。因此它位于“/var/www/cgi-bin/Modules/”位置。 - Ahoura Ghotbi
就像我在我的答案中所说的那样,use lib dirname(realpath($0)).'/Modules'; - ikegami
3个回答

6

有多种方法可以实现,其中很多方法在perlfaq8中有介绍:如何在运行时将目录添加到我的包含路径(@INC)中?

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文件的头部,任何帮助将不胜感激! - Ahoura Ghotbi
3
如果你有一个CGI程序并且可以使用类似于.htaccess的东西,那么请使用方法#2。否则,请使用方法#3。 - brian d foy

1

最简单的是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));

你也可以在命令行上提供它。

perl -I$lib_dir script.pl

最后,如果你想要全局设置它,你可以在你的登录脚本中设置环境变量PERL5LIB
export PERL5LIB=$lib_dir

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


0

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

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

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


1
大多数CGI脚本都在“/”作为当前目录下执行,因此对它们来说,“.”是无用的。 - ikegami
2
有些东西告诉我他不想要 perl 的配置。他绝对不应该创建一个名为 Config 的模块。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接