Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用安装在不同路径/目录中的Perl模块_Perl_Perl Module - Fatal编程技术网

调用安装在不同路径/目录中的Perl模块

调用安装在不同路径/目录中的Perl模块,perl,perl-module,Perl,Perl Module,我正在编写一个Perl脚本,它可以- SSH连接到一个服务器,并使用Net::OpenSSHPerl模块执行一些操作 我希望使用log::Log4perlPerl模块将脚本的整个日志存储在特定的日志文件中 我想使用Text::CSVPerl模块将一些数据写入CSV文件 实际上,这三个Perl模块安装在不同的目录中 比方说- Net::OpenSSH安装在/path/to/lib1中 Log::Log4perl安装在/path/to/lib2中 Text::CSV安装在/path/to/li

我正在编写一个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行中分别提到了如下路径:

方法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
..
#!/usr/bin/perl

use strict;
use warnings;

use lib '/path/to/lib1';
use lib '/path/to/lib2';
use lib '/path/to/lib3';
...
#!/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";
...
这对我来说非常好

我找到了另一种方法来调用这些Perl模块,如下所示:

方法2:

#!/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
..
#!/usr/bin/perl

use strict;
use warnings;

use lib '/path/to/lib1';
use lib '/path/to/lib2';
use lib '/path/to/lib3';
...
#!/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";
...
以上方法对我来说也很好

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

我对它的语法感到困惑。如何使用
FindBin
Perl模块实现同样的功能

方法3:

#!/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
..
#!/usr/bin/perl

use strict;
use warnings;

use lib '/path/to/lib1';
use lib '/path/to/lib2';
use lib '/path/to/lib3';
...
#!/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)时不会出现


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

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

如果脚本所在的目录与模块所在的目录之间没有关系,则使用
$RealBin
是没有意义的。事实上,在这种情况下,使用
PERL5LIB
env变量通常比使用lib更有意义

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

在/path/to/bin/script中使用lib#,
“$RealBin/。/lib1”,这是/path/to/bin/。/lib1或/path/to/lib1
“$RealBin/。/lib2”,这是/path/to/bin/。/lib2或/path/to/lib2
“$RealBin/。/lib3”;#这是/path/to/bin/./lib3或/path/to/lib3

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

在我的例子中,脚本所在的目录和模块所在的目录之间没有关系。所以我想使用环境var
PERL5LIB
。你能提供更多关于这方面的信息吗。当我打印
$ENV{'PERL5LIB'}
时,我在终端中没有找到任何东西。这是检查的正确方法吗?看。在unixy系统上,
export PERL5LIB=/path/to/lib1:/path/to/lib2:/path/to/lib3