modules metacpan mcpan manager library perl module

metacpan - ¿Cómo se crea un módulo Perl?



perl package manager (8)

¿Cómo se escribe un módulo para Perl? En Python puedes usar:

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



Un detalle menor que las respuestas hasta ahora no han mencionado es que, si tiene un módulo (preferiblemente pequeño) que es lo suficientemente específico para su propósito que nunca será reutilizado, 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 se usa a menudo porque le da un paquete que está definido en un archivo cuyo nombre no es el mismo que el del paquete, lo que puede ser confuso porque tiene que use / require el nombre del archivo, pero hacer referencia al código en el paquete nombre.

También tenga en cuenta que el 1; solo se necesita 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.


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;

Un script que usa estos:

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


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

package Yourmodulename; # Here are your definitions 1; # Important, every module should return a true value

Entonces el programa que usa el módulo se verá así:

#!/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 sus módulos de una manera jerárquica (y con suerte lógica). Para hacerlo, crea un árbol de directorios como:

Su / Modulo.pm
Su / Otro / Módulo.pm

Y luego en tu programa:

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

Hay más facilidades para exportar funciones y variables desde su módulo, puede echar un vistazo a "Escribir Perl serio: el mínimo absoluto que necesita saber" de Henning Koch.


La forma más tradicional de configurar 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 otros han dicho, puedes usarlo así:

use Foo::Bar;


h2xs -XA -n My :: Módulo

h2xs es una utilidad que viene de serie con Perl, destinada a ayudar a construir módulos vinculados, incluidos encabezados / códigos C enlazados, pero que se puede usar para construir un esqueleto completo de un módulo perl puro (con los distintivos -XA), incluidas las cosas como un directorio de prueba, un archivo README, un Makefile y un Manifiesto. (un buen artículo que describe los detalles aquí: http://perltraining.com.au/tips/2005-09-26.html )

Es un poco de la vieja escuela, pero vale la pena mirarlo aunque sea por todos los recordatorios que te da acerca de cómo hacer las cosas bien (pruebas, documentación, números de versión, exportar y exportar listas, todas las cosas fáciles de olvidar ...)

Usted terminará con un archivo "Module.pm" dentro de un directorio "Mi" (desde "Mi :: Módulo") que se ve así:

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


Un equivalente "exacto" de tu ejemplo de 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 obtener más información, consulte la entrada del package en la documentación de perlfunc . Para obtener más información, consulte la documentación de Perlmod .