你如何爲Perl編寫模塊?在Python中,你可以使用:你如何創建一個Perl模塊?
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
你如何爲Perl編寫模塊?在Python中,你可以使用:你如何創建一個Perl模塊?
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
類:
# 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();
基本上
# lib/Class.pm
package Class;
use Moose;
# define the class
1;
是出口功能的模塊您創建一個名爲的文件,其內容是:
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"。
「精確」 在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文檔。
一個小細節,答案到目前爲止還沒有提到的是,如果你有一個(最好是較小的)模塊,該模塊是專門不夠具體,它永遠不會被重用,你可以把它放到同一個文件主程序或另一個包:
# 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;
,而不是在每個軟件包之後。
Intermediate Perl的最後三分之一致力於模塊創建。
每當你想知道如何做在Perl,檢查perltoc,爲Perl文檔目錄:
% perldoc perltoc
核心的幾個部分Perl文檔可以幫助您:
祝你好運,
建立一個模塊的最傳統的方式如下:
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.
和行吟詩人RS說,你可以用它像這樣:
use Foo::Bar;
h2xs的-XA -n我::模塊
是h2xs的附帶Perl作爲標準,用於建立連接的模塊,包括輔助工具鏈接的C頭文件/代碼,但可用於構建純Perl模塊的完整框架(帶-XA標誌),包括像測試目錄,README文件,Makefile和Manifest之類的東西。 (好文章,概述這裏的細節:http://perltraining.com.au/tips/2005-09-26.html)
它有點老派,但是這是值得的,即使只是爲所有的提醒它gves您關於得到的一切權利(測試,文檔,版本號,出口和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
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module
有趣的......在我見過的所有模塊,做出口的方式已經機智h「我們的@ISA qw(出口商);我們的@EXPORT = qw(funcx funcy funcz)「,即使在PBP中。 – 2009-02-18 00:30:28
出口商是內置的,但它很爛S :: Ex很...性感:) – jrockway 2009-02-18 01:29:04
真的。 :Exporter with your module。Dependencies suck!(但是我猜如果你使用的是Moose,你已經走上了這條路!) – 2009-02-18 04:28:22