【问题标题】:[perl]How to force perl use modules in my own path?[perl]如何强制 perl 在我自己的路径中使用模块?
【发布时间】:2013-03-22 06:00:56
【问题描述】:

我想让 perl 在我自己的路径中使用 DBI 模块(假设 /home/users/zdd/perl5/lib/DBI),但系统也有一个 DBI 模块,即 /usr/lib/perl5/库/DBI。 当我在脚本中编写以下代码时,perl默认使用系统路径,如何强制它使用我路径下的?

use lib './perl5/lib/DBI';
use DBI;

sub test {
....
}

/usr/lib/perl5/lib/DBI 已添加到我的 bash 配置文件中的 PATH 环境变量中,它被许多脚本使用,所以我无法禁用它。

【问题讨论】:

  • 你给了一个相对路径。您是否从脚本所在的同一位置运行脚本?
  • 是的,我也尝试使用绝对路径,也不行,是不是意味着,如果手头有两条路径,脚本会先选择系统?
  • 是的,它会选择第一个可用的..
  • @Guru,use lib将指定路径放在@INC的开头。因此,这将首先从用户的路径中选择模块,如果它确实在那里找到它的话。

标签: dbi perl


【解决方案1】:

DBI 主模块的文件位于./perl5/lib。所以你的路径没有指向它。

DBI 文件夹包含 DBI 的子模块,例如DBI::Foo(模块名称中的:: 表示您的模块目录结构)。

尝试使用 ./perl5/lib 作为您的库。

此外,如果当前目录不是您认为的那样,则使用相对路径将失败。如果您有疑问,请让您的脚本call cwd 查看当前目录是什么。

出于调试目的,使用以下方法可能会有所帮助:

no lib '[main Perl module library path here]';

这样您就可以确保您只使用自定义模块路径。任何找不到模块都会导致错误,而不是静默使用系统版本。

更新:有关详细信息,请参阅Perldoc on use lib。 Perl 使用您首先指定的库。如果没有,则表明它实际上并没有在您给定的位置找到模块。

【讨论】:

  • 试试看,还是用系统一的。
  • @zdd,你确定当前目录是你认为的那样吗?尝试使用绝对路径。我知道你说你已经尝试过绝对路径。但是,由于我的回答中所述的原因,那是行不通的。
  • @zdd,另请参阅我的答案的更新。如果您指定了正确的位置,这将起作用。
  • 我看到你的回答并从路径中删除了 DBI,但它仍然使用系统模块。
  • @zdd,如果这不起作用,那么use lib 语句没有指向您认为的内容,或者 DBI 模块不存在。出于测试目的,您还可以添加no lib [system Perl lib path here]。这将保证它不会从系统库中获取任何内容。
【解决方案2】:

除了 dan1111 的建议之外,我还建议您打印出 @INC(就在您的 use DBI 语句之前)并转储 %INC(就在您的 use DBI 语句之后)以查看您的脚本在做什么.这可能会帮助您调试问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多