向@INC添加路径,但不在Perl脚本中
我拥有一个用Perl和Java编写的工具。其中一个脚本使用诸如向@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
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
。