这似乎是一个非常简单的问题,但是我的Google-Fu使我失败了。
在Perl中包含其他文件中的函数的语法是什么?我正在寻找类似C的东西#include "blah.h"
我看到了使用Perl模块的选项,但这似乎需要对我当前的代码进行微不足道的重写。
这似乎是一个非常简单的问题,但是我的Google-Fu使我失败了。
在Perl中包含其他文件中的函数的语法是什么?我正在寻找类似C的东西#include "blah.h"
我看到了使用Perl模块的选项,但这似乎需要对我当前的代码进行微不足道的重写。
Answers:
使用模块。签出perldoc perlmod和Exporter。
在文件Foo.pm中
package Foo;
use strict;
use warnings;
use Exporter;
our @ISA= qw( Exporter );
# these CAN be exported.
our @EXPORT_OK = qw( export_me export_me_too );
# these are exported by default.
our @EXPORT = qw( export_me );
sub export_me {
# stuff
}
sub export_me_too {
# stuff
}
1;
在您的主程序中:
use strict;
use warnings;
use Foo; # import default list of items.
export_me( 1 );
或同时获得两个功能:
use strict;
use warnings;
use Foo qw( export_me export_me_too ); # import listed items
export_me( 1 );
export_me_too( 1 );
您也可以导入包变量,但是强烈建议不要这样做。
Perl需要做这份工作。您将需要通过添加来确保所有“必需”文件都返回真值
1;
在文件末尾。
这是一个小样本:
$ cat m1.pl
use strict;
sub x { warn "aard"; }
1;
$ cat m2.pl
use strict;
require "m1.pl";
x();
$ perl m2.pl
aard at m1.pl line 2.
但是,请尽快迁移到模块。
编辑
将代码从脚本迁移到模块的一些好处:
require
仅在运行时加载,而加载的包use
则需要进行较早的编译时检查。A package allows you to expose some functions, but hide others. With no packages, all functions are visible.
我们如何做到这一点?
我知道这个问题专门说“函数”,但是当我寻找“ perl包含”时,我在搜索中的位置很高,而且经常(像现在这样)我想包含变量(以一种简单的方式,而不必考虑关于模块)。因此,我希望可以在此处发布我的示例(另请参见:Perl require和variables;简而言之:use require
,并确保“ includer”和“ includee”文件都将变量声明为our
):
$ perl --version
This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...
$ cat inc.pl
use warnings;
use strict;
our $xxx = "Testing";
1;
$ cat testA.pl
use warnings;
use strict;
require "inc.pl";
our $xxx;
print "1-$xxx-\n";
print "Done\n";
$ perl testA.pl
1-Testing-
Done
$ cat testB.pl
use warnings;
use strict;
our $xxx;
print "1-$xxx-\n";
$xxx="Z";
print "2-$xxx-\n";
require "inc.pl";
print "3-$xxx-\n";
print "Done\n";
$ perl testB.pl
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
1--
2-Z-
3-Testing-
Done