我有一个简单的Perl脚本,它使用位于另一个文件setBounds()
中的辅助函数:
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;
如果我登录到远程计算机并运行相同的脚本,则没有错误。
我也尝试将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.pl
来自package Common;
use strict;
use warnings;
sub getTimeLoggerHelper{
#....
}
1;
__END__
我称之为
main.pl
同样的问题,本地工作,来自ssh - 相同的错误:
use Module::Load;
load Common;
如何摆脱这个问题?
答案 0 :(得分:4)
如果您需要使用require
,请提供完整路径
require "/full/path/to/common.pl";
即使文件位于同一目录中,也需要ssh
,因此.
中的@INC
脚本' s目录(但可能是你的HOME
)。在其他情况下也会发生这种情况。
请注意,这种方式是导入common.pl
中的所有。
使用合适的模块有很多好处。然后文件是.pm
,按照惯例,文件名是大写的(并且是驼峰式的)。
以下是文件bin/mail.pl
和lib/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
也很有用,特别是如果调用者导入的符号列表变长了。