17

你如何为 Perl 编写一个模块?在 Python 中,您可以使用:

# module.py
def helloworld(name):
    print "Hello, %s" % name

# main.py
import module
module.helloworld("Jim")
4

8 回答 8

27

一类:

# lib/Class.pm
package Class;
use Moose;

# define the class

1;

导出函数的模块:

# lib/A/Module.pm
package A::Module;
use strict;
use warnings;
use Sub::Exporter -setup => {
    exports => [ qw/foo bar/ ],
};

sub foo { ... }
sub bar { ... }

1;

使用这些的脚本:

# bin/script.pl
#!/usr/bin/env perl

use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin/../lib";

use Class;
use A::Module qw(foo bar);


print Class->new;
print foo(), bar();
于 2009-02-15T12:56:20.683 回答
25

基本上,您创建一个名为 的文件Yourmodulename.pm,其内容是:

package Yourmodulename;

# Here are your definitions

1; # Important, every module should return a true value

然后使用该模块的程序将如下所示:

#!/usr/bin/perl
use strict;            # These are good pragmas
use warnings;      

# Used modules
use Carp;              # A module that you'll probably find useful
use Yourmodulename;    # Your module

您可能希望以分层(并且希望是合乎逻辑的)方式组织您的模块。为此,您创建一个目录树,例如:

你的/Module.pm
你的/Other/Module.pm

然后在你的程序中:

use Your::Module;
use Your::Other::Module;

有更多工具可以从您的模块中导出函数和变量,您可以查看 Henning Koch 的“Writing Serious Perl: The absolute minimum you need to know”

于 2009-02-15T12:56:35.957 回答
14

Perl 中的 Python 示例的“精确”等效项如下所示:

# MyModule.pm
package MyModule;

sub helloworld { 
    my ( $name ) = @_;
    print "Hello, $name\n";
}

1;

# main.pl
use MyModule;
MyModule::helloworld( 'Jim' );

有关更多信息,请参阅perlfunc文档中的条目。package有关更多信息,请参阅perlmod文档。

于 2009-02-15T13:54:45.753 回答
11

中级 Perl的最后三分之一专门用于模块创建。

每当您想知道如何在 Perl 中做某事时,请查看 perltoc,Perl 文档的目录:

% perldoc perltoc

核心 Perl 文档的几个部分可以帮助您:

祝你好运,

于 2009-02-15T21:04:10.730 回答
6

到目前为止的答案还没有提到的一个小细节是,如果你有一个(最好是小)模块,它的目的足够明确以至于它永远不会被重用,你可以把它和主程序放在同一个文件中,或者另一个包:

# main.pl

# Since this is a beginner question, I'll also point out that you should
# *always* use strict and warnings.  It will save you many headaches.
use strict;
use warnings;

MyModule::helloworld('Jim');
AnotherModule::helloworld('Jim');

package MyModule; # Still in main.pl!

sub helloworld { 
    my ( $name ) = @_;
    print "Hello, $name\n";
}

package AnotherModule; # Yep, still main.pl

sub helloworld {
    my $name = shift;
    print "Another hello to $name\n";
}

这不经常使用,因为它为您提供了一个在名称与包名称不同的文件中定义的包,这可能会让人感到困惑,因为您必须use/require文件名,但在代码中通过包名称引用它。

另请注意,1;仅需要作为通过use/包含的每个文件的最后一行require。在这种情况下,我不需要它,因为它在main.pl. 如果你把多个包放到同一个文件中,你只需要1;在文件末尾,而不是在每个包之后。

于 2009-02-15T14:20:49.903 回答
5

最传统的模块设置方式如下:

package Foo::Bar;
our @ISA       = qw(Exporter);       # Tells perl what to do with...
our @EXPORT    = qw(sub1 sub2 sub3); # automatically exported subs
our @EXPORT_OK = qw(sub4 sub5);      # exported only when demanded

# code for subs, constants, package variables here

1;  # Doesn't actually have to be 1, just a 'true' value.

正如其他人所说,您可以像这样使用它:

use Foo::Bar;
于 2009-02-18T04:31:31.633 回答
2
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module
于 2014-09-15T07:08:47.920 回答
2

h2xs -XA -n 我的::模块

h2xs 是 perl 的标准工具,旨在帮助构建链接模块,包括链接的 C 头文件/代码,但可用于构建纯 perl 模块的完整骨架(带有 -XA 标志),包括事物比如一个测试目录、一个 README 文件、一个 Makefile 和一个 Manifest。(一篇很好的文章在这里概述了细节:http: //perltraining.com.au/tips/2005-09-26.html

它有点老派,但值得一看,即使只是为了提醒你一切正确(测试、文档、版本号、export 和 export_ok 列表,所有容易忘记的东西......)

您最终会在“My”目录(来自“My::Module”)中得到一个“Module.pm”文件,如下所示:

package My::Module;

use 5.008008;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration       use My::Module ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(

);

our $VERSION = '0.01';


# Preloaded methods go here.

1;
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

My::Module - Perl extension for blah blah blah
于 2011-10-04T07:28:22.737 回答