我正在编写一个Perl脚本,它可以-
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行中提到了各自的路径,如下所示:
方法1:
#!/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模块的方法,如下所示:
方法2:
#!/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模块实现相同的目标。
方法3:
#!/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";
...
这引发了以下错误,当我使用前两种方法(Method1,Method2)时不会出现。
unable to load Perl module IO::Pty: Can't locate IO/Pty.pm in @INC ...
我在方法3中做错了什么?
$RealBin
是脚本所在的目录。($Bin
是同一事物的损坏版本。)
如果脚本所在的目录与模块所在的目录之间没有关系,则使用没什么意义$RealBin
。实际上,与这种情况PERL5LIB
相比use lib
,使用env var通常更有意义。
另一方面,如果脚本位于中/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
,真的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句