这似乎是一个非常简单的问题,但不知怎的,我的Google-Fu让我失望。
在Perl中包含其他文件的函数的语法是什么?我正在寻找像C #include "blah.h"
我看到了使用Perl模块的选项,但这似乎需要对我当前的代码进行无意义的重写。
答案 0 :(得分:65)
使用模块。查看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 );
您也可以导入包变量,但强烈建议您不要这样做。
答案 1 :(得分:45)
Perl require将完成这项工作。您需要确保任何'require'd文件通过添加
返回真值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
的软件包需要进行早期编译时检查。答案 2 :(得分:8)
答案 3 :(得分:7)
此外,do 'file.pl';
将起作用,但模块是更好的解决方案。
答案 4 :(得分:5)
我知道这个问题具体说“功能”,但是当我寻找“perl include”时,我在搜索中将这篇文章提高了很多时间(就像现在一样)我想要包含变量(以简单的方式,没有不得不考虑模块)。所以我希望可以在这里发布我的示例(另请参阅:Perl require and variables;简而言之:使用require
,并确保“includer”和“includee”文件都将变量声明为{{1 }}):
our
答案 5 :(得分:4)
你真的应该研究一下perl模块,但是为了快速入侵,你总是可以运行“perl -P”,它通过C预处理器运行你的perl脚本。这意味着你可以做#include和朋友......
虽然只是快速破解,但要注意; - )
答案 6 :(得分:4)
你在寻找'require file.pl',但你应该看到的是'使用模块'。
答案 7 :(得分:3)
以上答案都忽略了客户端部分:如何导入模块。
请参阅此处接受的答案: How do I use a Perl module from a relative location?
如果没有这个答案中的诀窍,那么当你use $mymodule;
答案 8 :(得分:0)
require
大致相当于包含。所有命名空间的好处都可以在所需的 perl 脚本中实现,就像 perl 模块一样。 “魔法”在于你在脚本中的内容。
包含脚本的唯一警告是您需要在脚本末尾添加 return 1;
,否则 perl 会说它失败了,即使您没有在脚本中调用任何内容。
require "./trims.pl"
然后在您的 perl 脚本中,它可以很简单:
#!/usr/bin/perl
#use "trims.pl";
sub ltrim { my $s = shift; $s =~ s/^\s+//; return $s };
sub rtrim { my $s = shift; $s =~ s/\s+$//; return $s };
sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
return 1;
此示例从输入字符串的左侧、右侧或两端删除空格。 $string = trim($string);
#use "trims.pl"
的注释可以粘贴到您的 perl 脚本中,取消注释(删除 #),perl 将在您的脚本所在的同一文件夹中查找 trims.pl 并放置函数 ltrim() , rtrim() 和 trim() 在全局命名空间中,因此您不能在任何其他全局命名空间中使用这些函数名称,否则 perl 会检测到冲突并停止执行。
要了解有关控制名称空间的更多信息,请查看“perl 包和模块”package Foo;