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

时间:2009-11-10 23:34:55

标签: perl include

这似乎是一个非常简单的问题,但不知怎的,我的Google-Fu让我失望。

在Perl中包含其他文件的函数的语法是什么?我正在寻找像C #include "blah.h"

这样的东西

我看到了使用Perl模块的选项,但这似乎需要对我当前的代码进行无意义的重写。

9 个答案:

答案 0 :(得分:65)

使用模块。查看perldoc perlmodExporter

在文件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)

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

答案 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;

https://perldoc.perl.org/functions/package