【问题标题】:Calling a Perl Module which is Installed in different path/directory调用安装在不同路径/目录中的 Perl 模块
【发布时间】:2021-01-03 00:19:32
【问题描述】:

我正在编写一个 Perl 脚本 -

  • SSH 到其中一台服务器并使用Net::OpenSSH Perl 模块进行一些操作。
  • 我希望使用Log::Log4perl Perl 模块将脚本的整个日志存储在某个日志文件中。
  • 我想使用Text::CSV Perl 模块将一些数据写入 CSV 文件。

其实这三个 Perl 模块已经安装在不同的目录中了。

让我们说 -

  • Net::OpenSSH 安装在 /path/to/lib1
  • Log::Log4perl 安装在 /path/to/lib2
  • Text::CSV 安装在 /path/to/lib3

由于这些 Perl 模块已安装在不同的位置,我在 Shebang 行中提到了各自的路径,如下所示:

方法一:

#!/usr/bin/perl -I/path/to/lib1 -I/path/to/lib2 -I/path/to/lib3

use strict;
use warnings;

use Net::OpenSSH;
use Log::Log4perl;
use Text::CSV;

#continue flow of the script
..

这对我来说非常好。

我发现了另一种调用这些 Perl 模块的方法,如下所示:

方法二:

#!/usr/bin/perl

use strict;
use warnings;

use lib '/path/to/lib1';
use lib '/path/to/lib2';
use lib '/path/to/lib3';
...

上述方法对我也很有效。

我找到了使用FindBin 调用这些Perl 模块的标准方法。

我对它的语法感到困惑。如何使用FindBin Perl 模块实现相同的目标。

方法三:

#!/usr/bin/perl

use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin/path/to/lib1";
use lib "$Bin/path/to/lib2";
use lib "$Bin/path/to/lib3";
...

这会引发以下错误,当我使用前两种方法(方法 1、方法 2)时不会出现。

unable to load Perl module IO::Pty: Can't locate IO/Pty.pm in @INC ...

我在方法 3 中哪里做错了?

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

    $RealBin 是脚本所在的目录。 ($Bin 是同一件事的损坏版本。)

    如果脚本所在的目录和模块所在的目录没有关系,那么使用$RealBin是没有意义的。事实上,在这种情况下,使用 PERL5LIB 环境变量通常比使用 use lib 更有意义。

    另一方面,如果脚本位于/path/to/bin,则使用相对于$RealBin 的路径可能有意义。

    use lib                 # In /path/to/bin/script,
       "$RealBin/../lib1",  #    This is /path/to/bin/../lib1, or /path/to/lib1
       "$RealBin/../lib2",  #    This is /path/to/bin/../lib2, or /path/to/lib2
       "$RealBin/../lib3";  #    This is /path/to/bin/../lib3, or /path/to/lib3
    

    $RealBin 通常在脚本和模块打包在一起(同一个项目的一部分)时使用。 use lib 也一样,真的。

    【讨论】:

    • 就我而言,脚本所在的目录与模块所在的目录之间没有关系。所以我想使用环境变量PERL5LIB。您能否提供更多信息。当我打印 $ENV{'PERL5LIB'} 时,我在终端中没有找到任何东西。这是正确的检查方式吗?
    • perlrun。在 unixy 系统上,export PERL5LIB=/path/to/lib1:/path/to/lib2:/path/to/lib3
    猜你喜欢
    • 2020-02-11
    • 2015-11-20
    • 2019-03-31
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多