我正在维护几个Perl脚本,它们都具有不同功能的类似代码块。每次更新代码块时,我都必须遍历每个脚本并手动进行更改。
有没有办法将常用函数封装到自己的脚本中并调用它们?
答案 0 :(得分:12)
将常用功能放在module中。有关详细信息,请参阅perldoc perlmod
。
答案 1 :(得分:6)
还有其他方法,但它们都有严重的问题。模块是要走的路,它们不一定非常复杂。这是一个基本模板:
package Mod;
use strict;
use warnings;
use Exporter 'import';
#list of functions/package variables to automatically export
our @EXPORT = qw(
always_exported
);
#list of functions/package variables to export on request
our @EXPORT_OK = qw(
exported_on_request
also_exported_on_request
);
sub always_exported { print "Hi\n" }
sub exported_on_request { print "Hello\n" }
sub also_exported_on_request { print "hello world\n" }
1; #this 1; is required, see perldoc perlmod for details
创建像/home/user/perllib
这样的目录。将该代码放在该目录中名为Mod.pm
的文件中。你可以使用这样的模块:
#!/usr/bin/perl
use strict;
use warnings;
#this line tells Perl where your custom modules are
use lib '/home/user/perllib';
use Mod qw/exported_on_request/;
always_exported();
exported_on_request();
当然,您可以根据需要为文件命名。将包命名为与文件相同是一种好的形式。如果您希望在包名称中包含::
(例如File::Find
),则需要在/home/user/perllib
中创建子目录。每个::
等同于/
,因此My::Neat::Module
将放在文件/home/user/perllib/My/Neat/Module.pm
中。您可以在perldoc perlmod
中了解有关模块的更多信息,并在perldoc Exporter
Exporter
答案 2 :(得分:2)
大约三分之一的Intermediate Perl专门讨论这个话题。
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以使用
require "some_lib_file.pl";
您将放置所有常用功能,并从包含上述行的其他脚本中调用它们。
例如:
146$ cat tools.pl
# this is a common function we are going to call from other scripts
sub util()
{
my $v = shift;
return "$v\n";
}
1; # note this 1; the 'required' script needs to end with a true value
147$ cat test.pl
#!/bin/perl5.8 -w
require 'tools.pl';
print "starting $0\n";
print util("asdfasfdas");
exit(0);
148$ cat test2.pl
#!/bin/perl5.8 -w
require "tools.pl";
print "starting $0\n";
print util(1);
exit(0);
然后执行test.pl
和test2.pl
将产生以下结果:
149$ test.pl
starting test.pl
asdfasfdas
150$ test2.pl
starting test2.pl
1