如何在我的Perl脚本中包含来自另一个文件的函数?
这似乎是一个非常简单的问题,但不知何故,我的Google-Fu失败了。
在Perl中包含其他文件的函数的语法是什么? 我正在寻找像C的#include "blah.h"
我看到了使用Perl模块的选项,但似乎需要对当前代码进行不重要的重写。
使用一个模块。 检出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 );
或者获得这两个function:
use strict; use warnings; use Foo qw( export_me export_me_too ); # import listed items export_me( 1 ); export_me_too( 1 );
您也可以导入包variables,但强烈build议不要这样做。
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.
但尽可能快地迁移到模块。
编辑
将代码从脚本迁移到模块的一些好处:
- 没有包,所有东西都占用一个命名空间,所以你可能会遇到这样一种情况:来自不同文件的两个函数需要相同的名字。
- 一个包允许你暴露一些function,但隐藏其他function。 没有包,所有function都可见。
- 包含在
require
中的文件只在运行时加载,而use
加载的包则受到较早的编译时检查。
我相信你正在寻找需求或使用关键字。
另外, do 'file.pl';
将工作,但模块是更好的解决scheme。
我知道这个问题明确地说“函数”,但是当我查找“perl include”时,我在search中得到了这个post,并且经常(像现在一样)我想包含variables(以一种简单的方式,而不必考虑关于模块)。 所以我希望可以在这里发表我的例子(另请参见: Perl的要求和variables ;简而言之:使用require
,并确保“includer”和“includee”文件声明variables为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
你真的应该看看perl模块,但是,一个快速的黑客,你总是可以运行“perl -P”,它通过C预处理器运行你的perl脚本。 这意味着你可以做#include和朋友….
只有一个快速入侵,谨防;-)
你在找什么是'require file.pl',但你应该看的是'使用模块'。
以上的答案都忽略了客户端部分:如何导入模块。
在这里看到接受的答案: 我如何从相对位置使用Perl模块?
没有这个答案的技巧,当你use $mymodule;
时候,你会遇到很多麻烦use $mymodule;