假设我们是 perl 的新手,并且写了一些很棒的模块MyModule.pm
。我们还编写了一些很棒的脚本myscript.pl
,需要使用这个模块。
use strict;
use warnings;
use MyModule;
etc...
现在我们将创建目录/home/user/GreatScript
并将我们的文件放入其中。并试图运行myscript.pl
...
cd /home/user/GreatScript
perl myscript.pl
伟大的!现在转到另一个目录...
cd /
perl /home/user/GreatScript/myscript.pl
@INC
得到一些关于路径和列表的不太有用的错误。这是什么?现在经过一些谷歌搜索,我们知道其中@INC
包含搜索模块的路径,这个错误意味着 Perl 无法找到 MyModule.pm。
现在我们可以:
- 添加到系统 PERL5LIB var 的路径,它会将我们的路径添加到
@INC
将我们的模块安装到以下目录之一的开头@INC
@INC
在BEGIN
添加到我们的脚本部分中手动添加我们的路径use lib '/home/user/GreatScript';
,但它看起来很糟糕。如果我们将脚本移动到其他目录怎么办?- 或者使用
FindBin
module 找到我们当前的目录,并use lib "$FindBin::Bin";
在. - 或者使用 __FILE__ (或 $0)变量并使用模块中的
abs_path
方法从中提取路径。Cwd
看起来像另一辆自行车? - 或者一些忘记或丢失(我错过了什么吗?)
为什么这种明显且常规的操作需要大量工作?如果我有一个脚本,这很容易......但是为什么我需要为我的所有脚本编写这几行额外的代码呢?而且它不会 100% 起作用!为什么 perl 默认不添加当前脚本目录@INC
,就像使用“.”一样?
PS:我正在寻找我的问题的答案,但仅从上面的列表和其他一些列表中找到解决方案列表。我希望这个问题是重复的......