我是用Perl和Java编写的工具的所有者。其中一个脚本使用了JSON
和Data::Dumper
之类的模块。
我的环境和我的@INC
知道这些模块的位置。但是使用我的工具的用户有一个错误:
Can't locate JSON.pm in @INC (@INC contains: <PATHS> .) at /tools/bin/myscript.pl line 15.
我了解@INC
的工作原理,我只是想知道什么是解决此问题的正确方法。我们在同一家公司(不同地区)工作,因此用户确实有权访问包含这些模块的区域。
从我的角度来看,这些脚本可以正常工作,因为我的@INC
确实包含指向其中包含这些模块的区域的路径。
从以前的线程中,我了解到我可以使用包含(而非递归)包的区域设置PERL5LIB
。但是这个问题感觉还不够好,因为然后我必须指定多个路径(因为JSON和Data :: Dumper不在同一区域,并且PERL5LIB
检查目录中的模块,但不是递归的)。>
此外,从先前的线程中,我了解到我可以运行perl -I myscript.pl
,但这无济于事,因为我的工具主要是Java,它执行Perl。此外,我不希望在脚本本身而不是在用户环境下进行任何更改。
解决此类问题的方法是什么?有没有办法从Linux“推”到@INC
的路径?将来如何避免此类问题?
答案 0 :(得分:2)
据您的描述,PERL5LIB
似乎是一个很好的解决方案。
我不知道“ PERL5LIB
检查目录中的模块但不递归”是什么意思,但是PERL5LIB
是一个shell变量,通常在您的外壳程序配置文件(也可以动态完成),并保存到目录的 list 中。在Environment (perlrun)中,PERL5LIB
是
在标准库和当前目录中查找之前,要在其中查找Perl库文件的目录列表。 [...]
因此,您可以将其设置为涵盖所有所需目录的合适目录。
通过使用export
in [ba]sh
export PERL5LIB="/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3"
如果目录名称中有空格,则使用引号。该行通常输入文件~/.bashrc
或者,如果在setenv
中使用[t]csh
,并在下一行添加到~/.tcshrc
setenv PERL5LIB "/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3"