调用安装在不同 path/directory 中的 Perl 模块
Calling a Perl Module which is Installed in different path/directory
我正在编写一个执行 -
的 Perl 脚本
- 通过 SSH 连接到其中一台服务器并使用
Net::OpenSSH
Perl 模块进行一些操作。
- 我想使用
Log::Log4perl
Perl 模块将整个脚本日志存储在某个日志文件中。
- 我想使用
Text::CSV
Perl 模块将一些数据写入 CSV 文件。
其实这三个Perl Module已经安装在不同的目录下了。
假设-
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 ...
方法三哪里做错了?
$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
也一样,真的。
我正在编写一个执行 -
的 Perl 脚本- 通过 SSH 连接到其中一台服务器并使用
Net::OpenSSH
Perl 模块进行一些操作。 - 我想使用
Log::Log4perl
Perl 模块将整个脚本日志存储在某个日志文件中。 - 我想使用
Text::CSV
Perl 模块将一些数据写入 CSV 文件。
其实这三个Perl Module已经安装在不同的目录下了。
假设-
Net::OpenSSH
安装在 /path/to/lib1Log::Log4perl
安装在 /path/to/lib2Text::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 ...
方法三哪里做错了?
$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
也一样,真的。