包含来自其他位置的perl模块

时间:2016-08-08 08:43:52

标签: perl

我的问题如下

  1. 我的lib位于./abc/def/lib
  2. 我在路径中使用它./abc/xyz/lib/tuv/abc.pm
  3. 我从一个不同的位置运行代码 这就像./abc/xyz/blah1/blah2/../../。我在这里运行代码。

    我创建了env params

    setenv def ./abc/def 
    setenv xyz ./abc/xyz
    

    我尝试了以下解决方案

    1. Begin { push(@INC, $ENV{def}."/lib" ) }
      同时为我使用的其他库提供路径 使用lib $ ENV {xyz}。" / lib"

      这个解决方案没有用。我收到错误说明./abc/def/lib中的库 不包括在内。

    2. 我尝试了FindBin

      # for the libs present in ./abc/def/lib
      use FindBin;
      use lib "$FindBin::Bin/../../";
      use mylib::abc;
      use mylib::def;
      
    3. (我尝试给出root的路径,从哪里开始寻找..在FindBin中)

      我尝试使用不同的组合但不确定为什么它不起作用。 有人可以指出我做错了什么,或者我对FindBin的理解是错误的。

2 个答案:

答案 0 :(得分:3)

你不能说出你遇到的问题。只是说你不知道为什么它不起作用"并不是很有帮助。我假设您已经无法在@ INC"中找到[某些模块]。错误。

有三种(推荐的)方法可以更改@INC的值。每个都有它们的用途。

  • 在程序中,您可以使用use lib
  • 从命令行(或在shebang中),您可以使用-I
  • 在您的shell环境中,您可以设置PERL5LIB

在所有这些情况下,新目录将被添加到@INC的开头,因此将在标准库目录之前搜索这些目录。

您也可以手动操作@INC。请注意,为了使@INC的人工操作对代码中的use语句产生任何影响,它们需要在BEGIN块中执行(如use语句在编译时执行)。看起来你也尝试过,但你使用的是Begin而不是BEGIN - 这是行不通的。

如果从与保留库的目录完全无关的位置运行程序,则FindBin可能用途有限。 FindBin在可执行文件的位置和库密切相关的情况下非常有用(例如,可执行文件位于./bin,库位于./lib)。

您似乎也在尝试从库中调整@INC./abc/xyz/lib/tuv/abc.pm)。请注意,FindBin不会将$FindBin::Bin设置为此目录。 $FindBin::Bin始终设置为包含正在运行的可执行文件的目录。

在不了解您正在使用的实际路径的情况下(您的示例中仅提供了相对路径),很难确定最佳方法是什么。但我认为在您的情况下,我会将PERL5LIB设置为额外库的绝对路径。

答案 1 :(得分:0)

FindBin模块最适合您的需求。要记住的重要一点是$FindBin::Bin指的是包含脚本的目录。所以当你提到它时......

use lib $FindBin::Bin . '/../../etc';

' /../..&# 39; path必须描述从脚本目录到lib目录的路径。

要考虑的另一个重要事项是错误消息。它将从Can't locate Your/Module/Name.pm开始,然后继续列出@INC中的所有目录 - 库搜索路径。检查此目录列表以确保它包含您要添加的lib路径。