¿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")
¿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")
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();
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.
Gracias Brian :) – tunnuz
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.
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.
El último tercio de Intermediate Perl está dedicado a la creación de módulos.
Cada vez que desee saber cómo hacer algo en Perl, comprobar perltoc, la tabla de contenidos de la documentación de Perl:
% perldoc perltoc
Varias partes del núcleo documentación de Perl puede ayudarle a:
Buena suerte,
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;
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
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module
Exactamente lo que estaba buscando, muchas gracias :) – Thanos
... 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. –
El exportador está incorporado, pero es una mierda. S :: Ex es mucho ... más sexy :) – jrockway
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) –