【发布时间】:2013-11-02 05:21:15
【问题描述】:
假设我们是 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的目录之一 - 在
BEGIN部分手动添加到@INC的路径 将use lib '/home/user/GreatScript';添加到我们的脚本中,但它看起来很糟糕。如果我们将脚本移动到其他目录会怎样? - 或者使用
FindBin模块找到我们当前的目录,并在use lib "$FindBin::Bin";中使用这个路径,但是并不是100%有效,比如mod_perl或者issues的一些bug... - 或使用 __FILE__(或 $0)变量并使用来自
Cwd模块的abs_path方法从中提取路径。看起来像另一辆自行车? - 或者有些遗忘或遗漏(我错过了什么吗?)
为什么这个显而易见的常规操作需要大量工作? 如果我有一个脚本,这很容易……但是为什么我需要为我的所有脚本编写这几行额外的代码呢?而且它不会 100% 起作用!为什么 perl 默认不将当前脚本目录添加到 @INC,就像使用 "." 一样?
PS:我正在寻找我的问题的答案,但仅从上面的列表和其他一些列表中找到解决方案列表。我希望这个问题是重复的......
【问题讨论】:
-
“需要大量工作”是什么意思?您已经找到了四种方法来做到这一点。基本上所有语言(python、Java、ruby、任何需要特定 DLL/SO 文件的东西,......)都有同样的问题。哎呀,你甚至需要那种东西来定位 perl 可执行文件本身(
PATH设置)。 -
所有这些方法都有一些问题,而且不是 100% 保存,我认为在 perl 的核心级别上添加当前脚本目录的路径并不难......
-
如果这不是您想要的,您会怎么做?如果您确实需要当前路径中的内容来覆盖脚本位置中的内容怎么办?然后你需要别的东西来禁用默认值。在所有语言和平台(直接或通过某种形式的注册表)中,必须为您使用的“模块”设置类似 PATH 的东西。
-
您缺少
sitecustomize.pl作为可以操纵@INC的系统级挂钩(可用于实现用户或脚本特定挂钩)。那以及您提到的任何技术都比依赖脚本的 cwd 事故要好。 Neil Slater's answer 更好。
标签: perl