Articulo de referencia

Módulo Perl

Diagrama del mecanismo de uso de módulos Perl. Un módulo Perl [ 1 ] : 278 [ 2 ] : 227 es un componente discreto de software para el lenguaje de programación Perl . Técnicamente,...

Diagrama del mecanismo de uso de módulos Perl.

Un módulo Perl [ 1 ] : 278 [ 2 ] : 227 es un componente discreto de software para el lenguaje de programación Perl . Técnicamente, es un conjunto particular de convenciones para usar el mecanismo de paquetes de Perl que se ha adoptado universalmente.

Un módulo define su código fuente dentro de un paquete (similar a un paquete Java ), el mecanismo de Perl para definir espacios de nombres , por ejemplo, CGI , Net::FTP o XML::Parser ; la estructura de archivos refleja la estructura del espacio de nombres (por ejemplo, el código fuente de Net::FTP se encuentra en Net/FTP.pm ). Además, un módulo es el equivalente en Perl de una clase cuando se emplea programación orientada a objetos .

Una distribución se compone de un conjunto de módulos, con su documentación correspondiente , scripts de compilación y, por lo general, un conjunto de pruebas . La comunidad Perl cuenta con una amplia biblioteca de distribuciones disponibles para su búsqueda y descarga a través de CPAN .

Perl es un lenguaje que permite diversos estilos de programación. Un desarrollador puede encontrar módulos tanto en estilo procedimental (por ejemplo, Test::Simple ) como orientado a objetos (por ejemplo, XML::Parser ); ambos se consideran igualmente válidos según la función del módulo. Los módulos también pueden utilizarse para mezclar métodos ( DBIx::Class ) o como directivas ( strict.pm ), que surten efecto inmediatamente después de su carga. Incluso pueden modificar la sintaxis del lenguaje. El efecto de los módulos Perl suele limitarse al ámbito en el que se cargaron.

Es común que los módulos de Perl incluyan documentación integrada en el formato de documentación estándar de Perl (POD ). POD impone poca estructura al autor y es lo suficientemente flexible como para usarse en artículos, páginas web e incluso libros completos como Programming Perl . Esto contrasta con javadoc , que se especializa en documentar clases de Java . Por convención, la documentación de los módulos suele seguir la estructura de una página man de Unix .

El lenguaje Perl se define por una única implementación (conocida como "perl") y se actualiza (y en raras ocasiones se elimina) con cada nueva versión. Por ello, es importante que el autor de un módulo conozca las características que utiliza y la versión mínima requerida de Perl. El código de esta página requiere Perl 5.6.0, que actualmente se considera bastante antigua.

Ejemplos

A continuación se muestran ejemplos de " Hola, mundo " implementados en diferentes estilos de módulos. Es importante entender que en Perl no es necesario un módulo; las funciones y el código se pueden definir y usar en cualquier lugar. Esto es solo a modo de ejemplo. En contraste con Java , donde siempre se requiere una clase. Una función "Hola, mundo" real se escribiría de la siguiente manera:

sub hola { "Hola, mundo!\n" } print hola ();

o simplemente impreso en una sola línea:

Imprimir "¡Hola, mundo!\n" ;

Ejemplo de procedimiento

Aquí se muestra "Hola, mundo" implementado como un módulo procedimental con un objetivo personalizable para el saludo, simplemente para hacerlo más interesante. También se incluye un breve script para ilustrar el uso del módulo.

hola_mundo.pl

#!/usr/bin/env perl # Carga el módulo e importa cualquier función en nuestro espacio de nombres # (por defecto "main") exportada por el módulo. Hello::World exporta # hello() por defecto. Las exportaciones normalmente pueden ser controladas por quien llama. use Hello::World ;print hello (); # imprime "Hola, mundo!\n" print hello ( "Vía Láctea" ); # imprime "Hola, Vía Láctea!\n"

Hola/Mundo.pm

# "package" es el espacio de nombres donde reside la funcionalidad/los datos del módulo. # Determina el nombre del archivo si se desea que se "utilice". # Si consta de más de una palabra, restringe la ubicación del módulo.paquete Hola::Mundo ;# Por defecto, Perl permite usar variables sin declararlas . # Esto puede ser conveniente para scripts cortos y líneas de código. # Pero en una unidad de código más larga, como un módulo, es prudente declarar # las variables tanto para detectar errores tipográficos como para restringir su # accesibilidad adecuadamente desde fuera del módulo. La directiva `strict` # obliga a declarar las variables. `use strict` ; # Del mismo modo, Perl no emite la mayoría de las advertencias del compilador o del tiempo de ejecución por defecto. # Los scripts más complejos, como la mayoría de los módulos, suelen encontrarlas muy # útiles para la depuración. La directiva `warnings` activa las advertencias opcionales. `use warnings` ; # El número de versión de un módulo se almacena en `$ModuleName::VERSION`; ciertas # formas del comando integrado "use" dependen de que esta variable esté definida.nuestra $VERSIÓN = '1.00' ;# Hereda del módulo "Exporter", que se encarga de exportar funciones. # La mayoría de los módulos procedimentales hacen uso de esto.usar base 'Exportador' ;# Cuando se invoca el módulo, exporta, por defecto, la función "hello" al # espacio de nombres del código que lo utiliza.nuestro @EXPORT = qw(hola) ;# Las líneas que comienzan con un signo igual indican documentación POD integrada. # Las secciones POD terminan con una directiva =cut y pueden # mezclarse casi libremente con código normal.=head1 NOMBREHola::Mundo - Una encapsulación de un mensaje de salida común=head1 SINOPSIS use Hello::World;  print hello();  print hello("Vía Láctea");=head1 DESCRIPCIÓNEste es un módulo procedimental que te proporciona el famoso mensaje "¡Hola, mundo!", ¡y además es personalizable!=head2 FuncionesLas siguientes funciones se exportan por defecto.=head3 hola print hola();  print hola($target);Devuelve el famoso saludo. Si se proporciona un C<$target>, se utilizará; de lo contrario, "world" será el destino de su saludo.=cortar# define la función hello().sub hola { mi $target = shift ; $target = 'world' unless defined $target ; return "Hola, $target!\n" ; }=head1 AUTORJoe Hacker <joe@joehacker.org>=cortar# Un módulo Perl debe terminar con un valor verdadero o de lo contrario se considera que no # se ha cargado. Por convención, este valor suele ser 1, aunque puede ser # cualquier valor verdadero. Un módulo puede terminar con falso para indicar un fallo, pero # esto rara vez se usa y en su lugar die() (saldría con un error). 1 ;

Dado que Hello/World.pm no se encuentra en su ruta @INC, debe especificar . en la línea de comandos para ejecutar el ejemplo anterior:

perl -I. hello_world.pl

Ejemplo orientado a objetos

Aquí tienes un ejemplo de lo mismo realizado con un enfoque orientado a objetos. La ventaja de un módulo orientado a objetos es que cada objeto puede configurarse independientemente de los demás.

hola_mundo.pl

#!/usr/bin/env perluse Hello::World ; my $hello = Hello::World -> new ; $hello -> print ; # imprime "Hello, world!\n" $hello -> target ( "Milky Way" ); $hello -> print ; # imprime "Hello, Milky Way!\n"my $greeting = Hello::World -> new ( target => "Pittsburgh" ); $greeting -> print ; # imprime "Hello, Pittsburgh!\n" $hello -> print ; # sigue imprimiendo "Hello, Milky Way!\n"

Hola/Mundo.pm

# En Perl no existe una definición especial de 'clase'. Un espacio de nombres es una clase. paquete Hello::World ;use strict ; use warnings ; our $VERSION = "1.00" ;=head1 NOMBRE Hello::World - Una encapsulación de un mensaje de salida común =head1 SINOPSIS  use Hello::World;  my $hello = Hello::World->new();  $hello->print; =head1 DESCRIPCIÓN Esta es una biblioteca orientada a objetos que puede imprimir el famoso mensaje "HW". =head2 Métodos =head3 new  my $hello = Hello::World->new();  my $hello = Hello::World->new( target => $target ); Instancia un objeto que contiene un mensaje de saludo. Si se proporciona un C<$target>, se pasa a C<< $hello->target >>. =cut # El constructor de un objeto se llama new() por convención. Cualquier # método puede construir un objeto y puedes tener tantos como quieras. sub new { my ( $class , %args ) = @_ ; my $self = bless ({}, $class ); my $target = exists $args { target } ? $args { target } : "world" ; $self -> { target } = $target ; return $self ; } =head3 target  my $target = $hello->target;  $hello->target($target); Obtiene y establece el objetivo actual de nuestro mensaje. =cut sub target { my $self = shift ; if ( @_ ) { my $target = shift ; $self -> { target } = $target ; }return $self -> { target }; } =head3 to_string  my $greeting = $hello->to_string; Devuelve el $greeting como una cadena =cut sub to_string { my $self = shift ; return "Hola, $self->{target}!" ; } =head3 print  $hello->print; Imprime el saludo en STDOUT =cut sub print { my $self = shift ; print $self -> to_string (), "\n" ; } =head1 AUTOR Joe Hacker <joe@joehacker.org> =cut 1 ;

Paquetes y espacios de nombres de Perl

Un programa Perl en ejecución tiene un espacio de nombres incorporado llamado " main", que es el nombre predeterminado. Por ejemplo, una subrutina llamada Sub1puede llamarse como Sub1()o main::Sub1(). Con una variable, el símbolo apropiado se coloca delante del espacio de nombres; por lo tanto, una variable escalar llamada $var1también puede denominarse como $main::var1, o incluso $::var1. Se pueden crear otros espacios de nombres en cualquier momento.

paquete Namespace1 ; $var1 = 1 ; # creado en el espacio de nombres Namespace1, que también se crea si no existe previamente our $var2 = 2 ; # también creado en ese espacio de nombres; nuestro requerido si se aplica use strict my $var3 = 3 ; # my-declared con ámbito léxico - NO en ningún espacio de nombres, ni siquiera main
$ Namespace2:: var1 = 10 ; # creada en el espacio de nombres Namespace2, también creada si no existe previamente our $ Namespace2:: var2 = 20 ; # también creada en ese espacio de nombres my $ Namespace2:: var3 = 30 ; # error de compilación: las variables declaradas por my NO PUEDEN pertenecer a un paquete

Las declaraciones de paquete aplican el ámbito del paquete hasta la siguiente declaración de paquete o hasta el final del bloque en el que se realiza la declaración.

nuestro $mainVar = 'a' ; paquete Sp1 ; nuestro $sp1aVar = 'aa' ; imprimir "$main::mainVar\t$sp1aVar\n" ; # nota mainVar necesita calificar paquete Sp2 ; nuestro $sp2aVar = 'aaa' ; imprimir "$main::mainVar\t$Sp1::sp1aVar\t$sp2aVar\n" ; # nota mainVar y sp1aVar necesitan calificar paquete main ; imprimir "$mainVar\t$Sp1::sp1aVar\t$Sp2::sp2aVar\n" ; # nota sp1aVar y sp2aVar necesitan calificar$mainVar = 'b' ; { # NOTA: los paquetes y variables de paquete creados previamente siguen siendo accesibles package Sp1 ; our $sp1bVar = 'bb' ; print "$main::mainVar\t$sp1aVar\t$sp1bVar\n" ; # nota: mainVar necesita calificador { package Sp2 ; our $sp2bVar = 'bbb' ; print "$main::mainVar\t$Sp1::sp1aVar$Sp1::sp1bVar\t$sp2aVar$sp2bVar\n" ; } # nota: mainVar y sp1...Var necesitan calificador print "$main::mainVar\t$sp1bVar$sp1aVar\t$Sp2::sp2bVar$Sp2::sp2aVar\n" ; } # nota: package Sp1 se aplica por defecto # main se aplica de nuevo por defecto; todas las variables del paquete siguen siendo accesibles siempre que estén calificadas print "$mainVar\t$Sp1::sp1aVar$Sp2::sp2bVar\n" ;

Paquetes y módulos

Por convención, los espacios de nombres se asocian con los módulos; en la práctica, suele haber un espacio de nombres por módulo y viceversa, pero esto no es obligatorio según el lenguaje. Por ejemplo, el módulo 'estándar' CGI.pm tiene la siguiente declaración al principio:

paquete CGI ;

Este módulo, y su funcionalidad, se invocarían comúnmente de la siguiente manera:

use CGI ( ':standard' ); # importa muchas funciones, incluyendo b() ... print b ( 'Hola, mundo' ); # muestra <b>Hola, mundo</b>

Se podría agregar una subrutina "faltante" desde el espacio de nombres del programa que la utiliza.

sub CGI ::bi { # define el espacio de nombres de destino (CGI) y el nombre del subprograma (bi) return b ( i ( $_ [ 0 ])); }

y se invoca como se indica a continuación:

print CGI:: bi ( 'Hola, mundo' ); # muestra <b><i>Hola, mundo</i></b>

Sin embargo, aunque técnicamente factible, sería una práctica de programación dudosa. Sería mejor definir la subrutina en el espacio de nombres que la llama y llamarla desde ese espacio de nombres.

Véase también

Referencias

  1. Wall, Larry; Schwartz, Randal; Christiansen, Tom (1996). Programación en Perl . O'Reilly & Associates. ISBN 978-1-5659-2149-8Consultado el 21 de diciembre de 2025 .
  2. McMillan, Michael (1998). Perl desde cero . Osborne McGraw-Hill. ISBN 978-0-0788-2404-3Consultado el 21 de diciembre de 2025 .
  • Módulos de Perl (paquetes y tablas de símbolos)
  • Creación de nuevos módulos Perl y búsqueda de módulos existentes.
  • Guía de estilo de módulos Perl
  • Preparando un nuevo módulo para su distribución.
  • Configuración e instalación de módulos Perl