【问题标题】:Include perl module from a different location包含来自不同位置的 perl 模块
【发布时间】:2016-12-13 23:09:57
【问题描述】:

我的问题如下

  1. 我的库位于 ./abc/def/lib
  2. 我在路径 ./abc/xyz/lib/tuv/abc.pm 中使用它

我完全从不同的位置运行代码 这类似于 ./abc/xyz/blah1/blah2/../../ 。我在这里运行代码。

我已经创建了环境参数

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

我尝试了以下解决方案

  1. Begin { push(@INC, $ENV{def}."/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;
    

(我也尝试给出从哪里开始查找的 root 路径..in FindBin)

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    你没有说你遇到了什么问题。只是说你“不确定为什么它不起作用”并没有真正的帮助。我假设您收到“无法在 @INC 中找到 [某些模块]”错误。

    有三种(推荐的)方法可以更改@INC 的值。各有各的用途。

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

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

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

    如果您从与保存库的目录完全无关的位置运行程序,那么FindBin 的使用可能会受到限制。 FindBin 在可执行文件的位置和库密切相关的情况下很有用(例如,可执行文件在./bin,而库在./lib)。

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

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

    【讨论】:

    • 对不起@Dave Cross。我忘了提到错误。是的,我得到了你提到的错误。感谢您的详细解释。这让我更好地理解了何时使用 FindBin 以及更好的视角。感谢您的宝贵时间。
    【解决方案2】:

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

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

    “/../..”路径必须描述从脚本目录到 lib 目录的路径。

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

    【讨论】:

    • 非常感谢@Grant McLean 的解释。它澄清了我现在对 FindBin 的理解。你的回答很有帮助。
    猜你喜欢
    • 2010-10-24
    • 2014-10-06
    • 2014-01-19
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多