如何在Perl脚本中包含其他文件中的函数?

g6ll5ycj  于 2022-11-15  发布在  Perl
关注(0)|答案(9)|浏览(174)

这似乎是一个非常简单的问题,但不知何故,我的谷歌福失败了。
在Perl中包含其他文件中的函数的语法是什么?
我看到了使用Perl模块的选项,但这似乎需要重写我当前的代码。

pgvzfuti

pgvzfuti1#

使用模块。检查perldoc perlmodExporter
在文件www.example.com中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 );

您也可以导入包变量,但强烈建议不要这样做。

noj0wjuj

noj0wjuj2#

Perl require将完成这项工作。

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所载入的套件则会接受较早的编译阶段检查。
eivgtgni

eivgtgni3#

此外,do 'file.pl';也可以工作,但模块是更好的解决方案。

1cklez4t

1cklez4t4#

我相信您正在寻找requireuse关键字。

4sup72z8

4sup72z85#

我知道这个问题特别提到了“函数”,但是当我搜索“perl include”时,我会在搜索结果中找到这个帖子,而且经常(比如现在)我想包含变量(以一种简单的方式,而不必考虑模块)。所以我希望可以在这里发布我的例子(另请参见:Perl require and variables;简而言之:使用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
pnwntuvh

pnwntuvh6#

你真的应该研究一下perl模块,但是,为了快速破解,你可以运行“perl -P”,它通过C预处理器运行你的perl脚本。这意味着你可以做#include和friends......
只有一个快速黑客虽然,小心;- )

3wabscal

3wabscal7#

您要寻找的是'require file.pl',但您应该寻找的是'use module'。

xxls0lw8

xxls0lw88#

以上答案都忽略了客户端部分:如何导入模块。
请在此处查看可接受的答案:How do I use a Perl module from a relative location?
如果没有这个答案中的技巧,当你use $mymodule;时,你将很难获得正确的模块路径

z31licg0

z31licg09#

require大致等同于include。所有命名空间的好处都可以在所需的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 packages & modules”package Foo;
https://perldoc.perl.org/functions/package

相关问题