你如何为Perl编写模块?在Python中,您可以使用:
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
答案 0 :(得分: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();
答案 1 :(得分: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
您的/其他/ Module.pm
然后在你的程序中:
use Your::Module;
use Your::Other::Module;
您可以从模块中导出函数和变量的更多工具,您可以查看Henning Koch的"Writing serious Perl: The absolute minimum you need to know"。
答案 2 :(得分:14)
Perl中Python示例的“精确”等价物如下所示:
# MyModule.pm
package MyModule;
sub helloworld {
my ( $name ) = @_;
print "Hello, $name\n";
}
1;
# main.pl
use MyModule;
MyModule::helloworld( 'Jim' );
有关详情,请参阅the entry for package
in perlfunc文档。有关更多信息,请参阅perlmod文档。
答案 3 :(得分:11)
Intermediate Perl的最后三分之一致力于模块创建。
每当你想知道如何在Perl中做某事时,请检查perltoc,Perl文档的目录:
% perldoc perltoc
核心Perl文档的几个部分可以帮助您:
祝你好运,答案 4 :(得分: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;
,而不是在每个包之后。
答案 5 :(得分: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;
答案 6 :(得分:2)
h2xs -XA -n My :: Module
h2xs是一个标准的perl实用程序,用于帮助构建包含链接C头/代码的链接模块,但可用于构建纯perl模块的完整框架(带-XA标志) ,包括测试目录,README文件,Makefile和Manifest之类的东西。 (一篇很好的文章概述了这里的细节:http://perltraining.com.au/tips/2005-09-26.html)
这有点老派,但是值得关注的是即使只是为了所有的提醒它让你一切正确(测试,文档,版本号,导出和导出列表,所有容易忘记的东西。 ..)
你最终会在“我的”目录(来自“我的模块”)中找到一个“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
答案 7 :(得分:2)
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module