2009-02-15 467 views
16

你如何爲Perl編寫模塊?在Python中,你可以使用:你如何創建一個Perl模塊?

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

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

回答

27

類:

# 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(); 
+0

有趣的......在我見過的所有模塊,做出口的方式已經機智h「我們的@ISA qw(出口商);我們的@EXPORT = qw(funcx funcy funcz)「,即使在PBP中。 – 2009-02-18 00:30:28

+4

出口商是內置的,但它很爛S :: Ex很...性感:) – jrockway 2009-02-18 01:29:04

+2

真的。 :Exporter with your module。Dependencies suck!(但是我猜如果你使用的是Moose,你已經走上了這條路!) – 2009-02-18 04:28:22

24

基本上

# 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"

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文檔。

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

建立一個模塊的最傳統的方式如下:

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; 
2

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 
2
cpanm Module::Starter::PBP 
perl -MModule::Starter::PBP=setup 
module-starter --module=My::Module