向@INC添加路径,但不在Perl脚本中

向@INC添加路径,但不在Perl脚本中,perl,Perl,我拥有一个用Perl和Java编写的工具。其中一个脚本使用诸如JSON和Data::Dumper之类的模块。 我的环境和我的@INC知道这些模块的位置。但是使用我的工具的用户有一个错误: Can't locate JSON.pm in @INC (@INC contains: <PATHS> .) at /tools/bin/myscript.pl line 15. 在/tools/bin/myscript.pl第15行的@INC(@INC-contains:)中找不到JSON.p

我拥有一个用Perl和Java编写的工具。其中一个脚本使用诸如
JSON
Data::Dumper
之类的模块。 我的环境和我的
@INC
知道这些模块的位置。但是使用我的工具的用户有一个错误:

Can't locate JSON.pm in @INC (@INC contains: <PATHS> .) at /tools/bin/myscript.pl line 15.
在/tools/bin/myscript.pl第15行的@INC(@INC-contains:)中找不到JSON.pm。
我了解
@INC
的工作原理,我只是想知道解决这个问题的正确方法是什么。我们在同一家公司(不同的地区)工作,因此用户确实有权访问包含这些模块的区域。 从我的角度来看,这些脚本工作得很好,因为我的
@INC
中确实包含一条指向包含这些模块的区域的路径

从前面的线程中,我了解到我可以设置
PERL5LIB
,其中包含包(不是递归的)区域。但是这个问题感觉还不够好,因为接下来我必须指定多路径(因为JSON和Data::Dumper不在同一个区域中,
PERL5LIB
检查目录中的模块,但不是递归的)

另外,从前面的线程中,我了解到我可以运行
perl-imyscript.pl
,但这没有帮助,因为我的工具主要是执行perl的Java。此外,我不希望在脚本本身更改任何内容,而希望在用户环境中更改任何内容


解决这类问题的办法是什么?有没有办法从Linux“推送”到
@INC
的路径?如何防止将来出现类似问题?

从您的描述中,我可以收集到
PERL5LIB
似乎是一个很好的解决方案

我不知道您所说的“
PERL5LIB
检查目录中的模块但不递归”是什么意思,但是
PERL5LIB
是一个shell变量,通常在shell配置文件中设置(同时也可以动态设置)到目录列表中。从中,
PERL5LIB

在查找标准库和当前目录之前,要在其中查找Perl库文件的目录列表。[……]

因此,您可以将其设置为一个合适的目录列表,其中包含所有需要的内容

通过使用,确保它是一个环境变量

如果目录名中有空格,则引号在其中。该行通常输入到文件
~/.bashrc

setenv PERL5LIB "/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3" 
或者,如果在
[t]csh
中,使用
setenv
,并在
~/.tcshrc
中添加以下行

setenv PERL5LIB "/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3" 

为什么不正常安装您的代码所依赖的CPAN模块?@robert它们安装在不同的区域。我的意思是,如果我有以下结构:
/tools/main/dir1/JSON.pm
/tools/main/dir2/Data.pm
我不能使用
setenv PERL5LIB/tools/main
,因为它找不到这些模块。我必须为第一个模块设置准确的路径(如
/tools/main/dir1/
)。我认为这是Perl版本的问题。我使用
5.14.1
,用户使用
5.7.1
。为了从Linux角度设置正确的版本,需要更改哪些配置?
5.7.1
?你确定。这个版本从2001年4月开始已经有18年的历史了……5.7.1甚至还没有正式发布;这是一个开发版本,旨在让开发人员在即将发布的5.8产品版本正式发布之前发现问题。对不起,我的意思是
5.8.7
。不知道我为什么说
5.7.1
@vesii不,你是对的。
@INC
中的路径必须是安装模块的根目录,它们不是递归的-这对于具有存储在子目录中的多个名称组件的模块很重要。因此,在您的情况下,必须同时添加
/tools/main/dir1
/tools/main/dir2