2009-02-15 18 views
16

Come si scrive un modulo per Perl? In Python è possibile utilizzare:Come si crea un modulo Perl?

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

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

risposta

27

Una classe:

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

# define the class 

1; 

Un modulo che esporta funzioni:

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

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

1; 

uno script che utilizza questi:

# 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

Interessante ... in tutti i moduli che ho visto, il modo di fare di esportazione è stata ingegno h "il nostro @ISA qw (esportatore); il nostro @EXPORT = qw (funcx funcy funcz) ", anche in PBP. –

+4

Exporter è incorporato, ma fa schifo S :: Ex è molto ... più sexy :) – jrockway

+2

Vero. Ma poi devi distribuire Sub: : Esportatore con il tuo modulo. Le dipendenze fanno schifo! (Ma immagino, se stai usando Moose, hai già imboccato quella strada!) –

24

Fondamentalmente si crea un file denominato Yourmodulename.pm, il cui contenuto sono:

package Yourmodulename; 

# Here are your definitions 

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

Poi il programma che utilizza il modulo sarà simile:

#!/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 

Si consiglia di organizzare i moduli in modo gerarchico (e, si spera logico). Per fare in modo da creare un albero di directory come:

vostro/Module.pm
vostro/Altro/Module.pm

E poi nel programma:

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

Non ci sono più strutture per esportare funzioni e variabili dal tuo modulo, puoi dare un'occhiata a Henning Koch's "Writing serious Perl: The absolute minimum you need to know".

+0

Grazie brian :) – tunnuz

14

Un "esatta" equivalente del vostro esempio di Python in Perl sarebbe simile a questa:

# MyModule.pm 
package MyModule; 

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

1; 

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

Per di più, consultare la documentazione the entry for package in perlfunc. Per molto altro, consultare la documentazione perlmod.

6

Un piccolo dettaglio che le risposte finora non hanno menzionato è che, se si dispone di un modulo (preferibilmente piccolo) che è sufficientemente specifico per essere riutilizzato, è possibile inserirlo nello stesso file di il programma principale o un altro pacchetto:

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

Questo non viene utilizzato spesso perché ti dà un pacchetto che è definito in un file il cui nome non è la stessa come il pacchetto, che può diventare confuso perché si deve use/require il nome del file, ma fare riferimento in codice con il nome del pacchetto.

Si noti inoltre che lo 1; è necessario solo come riga finale di ogni file incluso tramite use/require. In questo caso, non ne ho avuto bisogno perché è in main.pl. Se si inseriscono più pacchetti nello stesso file, è necessario solo uno 1; alla fine del file, non dopo ogni pacchetto.

5

Il modo più tradizionale di creazione di un modulo è la seguente:

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. 

e come o il rs hanno detto, è possibile utilizzarlo in questo modo:

use Foo::Bar; 
2

h2xs -XA -n :: Modulo

h2xs è un programma di utilità che viene fornito di serie con perl, destinato per l'assistenza nella costruzione di moduli collegati tra header/codice C collegato, ma che può essere usato per costruire uno scheletro completo di un modulo perl puro (con i flag -XA), incluse cose come una directory di test, un file README, un Makefile e un Manifest. (un buon articolo che descrive i dettagli qui: http://perltraining.com.au/tips/2005-09-26.html)

È un po 'vecchio stile, ma vale la pena guardare anche se solo per tutti i promemoria che ti danno per ottenere tutto giusto (test, documentazione, numeri di versione, esportazione e export_ok liste, tutte le cose facili da dimenticare ...)

Finirai con un file "Module.pm" all'interno di una directory "My" (da "My :: Module") che sembra in questo modo:

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 
+0

Esattamente quello che stavo cercando, grazie mille :) – Thanos