无法找到由“require”加载的@INC Perl perl文件

时间:2017-01-01 10:26:58

标签: perl ssh

我有一个简单的Perl脚本,它使用位于另一个文件setBounds()中的辅助函数:

main.pl

common.pl

common.pl

#!/usr/bin/perl

use strict;
use warnings;

use Cwd 'abs_path';

use File::Basename qw( fileparse );
use File::Path qw( make_path );
use File::Spec;


require "common.pl";  # line 15

#...

本地一切运行良好,但是当我尝试通过ssh运行它时出现错误:

#!/usr/bin/perl

use strict;
use warnings;

sub getTimeLoggerHelper{
  #....
}

1;

[编辑1]

如果我登录到远程计算机并运行相同的脚本,则没有错误。

[编辑2]

我也尝试将Can't locate common.pl in @INC (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2/darwin-thread-multi-2level /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at /Users/snaggs/scripts/main.pl line 15. 转换为模块:

common.pm

common.pl

来自package Common; use strict; use warnings; sub getTimeLoggerHelper{ #.... } 1; __END__ 我称之为

main.pl

同样的问题,本地工作,来自ssh - 相同的错误:

use Module::Load;
load Common;

如何摆脱这个问题?

1 个答案:

答案 0 :(得分:4)

如果您需要使用require,请提供完整路径

require "/full/path/to/common.pl";

即使文件位于同一目录中,也需要ssh,因此.中的@INC 脚本' s目录(但可能是你的HOME)。在其他情况下也会发生这种情况。

请注意,这种方式是导入common.pl中的所有

使用合适的模块有很多好处。然后文件是.pm,按照惯例,文件名是大写的(并且是驼峰式的)。

以下是文件bin/mail.pllib/Common.pm

的简单示例

<强>仓/ main.pl

use warnings;
use strict;

use FindBin qw($RealBin);   # Directory in which the script lives
use lib "$RealBin/../lib";  # Where modules are, relative to $RealBin

use Common qw(test_me);

test_me();

设置@INC的关键部分,寻找模块, 用lib编译指示完成。它在编译时将目录添加到默认@INC的开头。 FindBin&#39; s $RealBin是脚本的目录,已解析链接。我们使用它,以便添加的路径相对于脚本而不是硬编码。当脚本及其库汇集在一起​​时,这有助于源组织。

另一种设置方法是通过environment variable PERL5LIB。使用bash

export PERL5LIB=/path/to/libdir

然后,对于Module.pm中的libdir,您只需要说use Module即可找到它。例如,这对于居住在特定位置并由各种脚本使用的模块非常有用。

<强> LIB / Common.pm

package Common;

use strict;
use warnings;

use Exporter qw(import);
our @EXPORT_OK = qw( test_me );

sub test_me { print "Hello from ", __PACKAGE__, "\n" }

1;

当包use时,其文件首先require d,然后模块的import方法在编译时运行。通过import,调用者实际获取模块中定义的符号(函数和变量的名称),并且我们必须在模块中提供import方法(或使用完全限定名,{{ 1}},在来电者中。)

Module::function行带来 use Exporter例程,因此我们不必编写自己的例程。对于Exporter的旧版本,这通过继承使用,通常由import使用。见文档。

然后通过@ISA = ('Exporter')提供符号。这要求呼叫者列出要使用的功能;它没有&#34;推&#34;默认情况下将任何内容放入其命还有@EXPORT_OK也很有用,特别是如果调用者导入的符号列表变长了。