【问题标题】:How can I include Perl modules with paths relative to the program?如何将 Perl 模块包含在与程序相关的路径中?
【发布时间】:2022-05-11 08:44:43
【问题描述】:

我有一个使用已安装软件包的 Perl 脚本。一个是 Perl 包,另一个是 Perl XS 包。

现在我想调用这个脚本,但使用未安装的包,而是通过路径具有相同名称的包。

我使用了perl -I /home/.../lib script.pl,但它不起作用

我该怎么做?

【问题讨论】:

  • 看哥们,不起作用是一个强有力的声明。它整天坐在沙发上吗?是在对你做鬼脸吗?它想要更多的钱吗?是和女朋友睡觉吗?请具体! :-)
  • 所以问题是您正在尝试加载自己的包,但正在加载默认包?

标签: perl module path


【解决方案1】:

有关影响模块加载位置的各种方式,请查看此 SO 帖子:

How is Perl's @INC constructed? (aka What are all the ways of affecting where Perl modules are searched for?)

【讨论】:

  • 我已经尝试了列表中的每一种方法/但它没有帮助/我仍然无法使用我自己的模块(
  • 您需要指定确切的包名称以便我们提供更详细的帮助 - 提供use xxx
  • 另外,请具体说明模块代码的目录结构
【解决方案2】:

您可以使用 lib 杂注将目录添加到 perl 用于查找模块的路径中。

所以,如果在默认目录中安装了一个名为 Foo 的模块,并且在 /home/cowens/perl5 中安装了不同的版本,你可以说

use lib "/home/cowens/perl5";
use Foo;

perl 将在/home/cowens/perl5 中找到版本。

【讨论】:

  • 很遗憾,这不是我的脚本,所以我无法修改它。我可以用选项运行它
【解决方案3】:

您能否向我们展示您存储要使用的模块的目录的递归列表? ls -R 可以帮助我们确定您是否有正确的路径。

当您使用-I 开关时,您必须确保在其中找到正确的路径。如果您使用模块:

 use Some::Module;

Perl 实际上寻找:

 $lib/Some/Module.pm

$lib@INC 中的目录之一。不过,另一种说法是,如果特定目录不在@INC 中,Perl 就不会查看它。这意味着 Perl 不会自动为您查找子目录

如果你的模块不在那个位置,Perl 就不会在那个$lib 里翻找它。您的 XS 模块可能不是这样存储的。它可能在路径中有 Perl 版本和架构类型,因此您可能会在以下位置找到它:

 $lib/5.10.1/darwin-2level/Some/Module.pm

如果您使用-I,则需要自己添加这些路径。

但是,您可以在命令行上加载模块。使用lib 更容易,它会为您添加额外的目录:

 perl -Mlib=/path/to/lib ...

【讨论】:

  • -I和-Mlib的优缺点是什么
  • 收益和风险取决于您在做什么。一个只添加您所说的内容,一个将arch和版本目录添加到@INC。这是好是坏取决于你想要什么。
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2017-12-22
  • 1970-01-01
相关资源
最近更新 更多