2009-02-15 25 views
16

¿Cómo se escribe un módulo para Perl? En Python se puede utilizar:¿Cómo se crea un módulo Perl?

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

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

Respuesta

27

Una clase:

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

# define the class 

1; 

Un módulo que exporta funciones:

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

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

1; 

de secuencias que utilicen éstos:

# 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

... interesante en todos los módulos que he visto, la forma de hacerlo exportación ha sido el ingenio h "nuestro @ISA qw (Exportador); nuestro @EXPORT = qw (funcx funcy funcz) ", incluso en PBP. –

+4

El exportador está incorporado, pero es una mierda. S :: Ex es mucho ... más sexy :) – jrockway

+2

Es verdad. Pero luego debes distribuir Sub: : Exportador con su módulo. ¡Las dependencias apestan! (Pero supongo que si está usando Moose, ya se ha ido por ese camino) –

24

Básicamente creas un archivo llamado Yourmodulename.pm, cuyos contenidos son:

package Yourmodulename; 

# Here are your definitions 

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

A continuación, el programa que utiliza el módulo será parecida:

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

Es posible que desee organizar los módulos de una manera jerárquica (y es de esperar lógico). Para ello se crea un árbol de directorios como:

Su/Module.pm
Su/Otros/Module.pm

Y luego, en su programa:

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

hay más instalaciones Para exportar funciones y variables desde su módulo, puede echar un vistazo a "Writing serious Perl: The absolute minimum you need to know" de Henning Koch.

+0

Gracias Brian :) – tunnuz

14

Un "exacta" equivalente de tu ejemplo Python en Perl se vería así:

# MyModule.pm 
package MyModule; 

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

1; 

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

Para más información, consulte la documentación the entry for package in perlfunc. Para obtener más información, consulte la documentación perlmod.

6

Un pequeño detalle que las respuestas hasta ahora no han mencionado es que, si tiene un módulo (preferiblemente pequeño) que es específico para un propósito que nunca se volverá a usar, puede ponerlo en el mismo archivo que el programa principal o otro paquete:

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

Esto no es de uso frecuente, ya que le da un paquete que se define en un archivo cuyo nombre no es lo mismo que el paquete de, lo que puede resultar confuso porque hay que use/require el nombre del archivo, pero haga referencia en el código por el nombre del paquete.

También tenga en cuenta que el 1; solo es necesario como la última línea de cada archivo que se incluye a través de use/require. En este caso, no lo necesitaba porque está en main.pl. Si coloca varios paquetes en el mismo archivo, solo necesita un 1; al final del archivo, no después de cada paquete.

5

La manera más tradicional de la creación de un módulo es la siguiente:

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. 

y como se othe rs han dicho, que se puede utilizar de esta manera:

use Foo::Bar; 
2

h2xs -XA -n Mi :: Módulo

h2xs es una utilidad que viene de serie con el Perl, destinada a asistir en la construcción de módulos vinculados incluidos C encabezados/código vinculados, pero que se pueden usar para construir un esqueleto completo de un módulo perl puro (con los distintivos -XA), incluidos elementos como un directorio de prueba, un archivo README, un Makefile y un Manifiesto. (un buen artículo esbozando los detalles aquí: http://perltraining.com.au/tips/2005-09-26.html)

Es un poco de la vieja escuela, pero vale la pena mirar incluso si solo por todos los recordatorios que te da acerca de cómo hacerlo bien (pruebas, documentación, números de versión, exportación y export_ok listas, todas las cosas fáciles de olvidar ...)

Terminará con un archivo "Module.pm" dentro de un directorio "Mi" (desde "Mi :: Módulo") que se ve de esta manera:

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

Exactamente lo que estaba buscando, muchas gracias :) – Thanos

Cuestiones relacionadas