Perl - Paquetes y módulos

¿Qué son los paquetes?

los packageLa declaración cambia el contexto de nomenclatura actual a un espacio de nombres especificado (tabla de símbolos). Así

  • Un paquete es una colección de código que vive en su propio espacio de nombres.

  • Un espacio de nombres es una colección con nombre de nombres de variables únicos (también denominada tabla de símbolos).

  • Los espacios de nombres evitan las colisiones de nombres de variables entre paquetes.

  • Los paquetes permiten la construcción de módulos que, cuando se utilizan, no chocarán con variables y funciones fuera del propio espacio de nombres de los módulos.

  • El paquete permanece en efecto hasta que se invoca otra declaración de paquete o hasta el final del bloque o archivo actual.

  • Puede hacer referencia explícita a las variables dentro de un paquete utilizando el :: calificador de paquete.

A continuación se muestra un ejemplo que tiene los paquetes principal y Foo en un archivo. Aquí se ha utilizado la variable especial __PACKAGE__ para imprimir el nombre del paquete.

#!/usr/bin/perl

# This is main package
$i = 1; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package Foo;
# This is Foo package
$i = 10; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package main;
# This is again main package
$i = 100; 
print "Package name : " , __PACKAGE__ , " $i\n"; 
print "Package name : " , __PACKAGE__ ,  " $Foo::i\n"; 

1;

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10

Bloques BEGIN y END

Puede definir cualquier número de bloques de código denominados BEGIN y END, que actúan como constructores y destructores respectivamente.

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • Cada BEGIN El bloque se ejecuta después de que se cargue y compile el script perl, pero antes de que se ejecute cualquier otra instrucción.

  • Cada bloque END se ejecuta justo antes de que salga el intérprete de Perl.

  • Los bloques BEGIN y END son particularmente útiles al crear módulos Perl.

El siguiente ejemplo muestra su uso:

#!/usr/bin/perl

package Foo;
print "Begin and Block Demo\n";

BEGIN { 
   print "This is BEGIN Block\n" 
}

END { 
   print "This is END Block\n" 
}

1;

Cuando se ejecuta el código anterior, produce el siguiente resultado:

This is BEGIN Block
Begin and Block Demo
This is END Block

¿Qué son los módulos Perl?

Un módulo Perl es un paquete reutilizable definido en un archivo de biblioteca cuyo nombre es el mismo que el nombre del paquete con una extensión .pm.

Un archivo de módulo Perl llamado Foo.pm puede contener declaraciones como esta.

#!/usr/bin/perl

package Foo;
sub bar { 
   print "Hello $_[0]\n" 
}

sub blat { 
   print "World $_[0]\n" 
}
1;

Algunos puntos importantes sobre los módulos Perl

  • Las funciones require y use cargará un módulo.

  • Ambos usan la lista de rutas de búsqueda en @INC para encontrar el módulo.

  • Ambas funciones require y use llama a eval función para procesar el código.

  • los 1; en la parte inferior hace que eval se evalúe como VERDADERO (y por lo tanto no falle).

La función Requerir

Se puede cargar un módulo llamando al require funciona de la siguiente manera:

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

Debe haber notado que los nombres de las subrutinas deben estar completamente calificados para llamarlos. Sería bueno habilitar la subrutinabar y blat para ser importados a nuestro propio espacio de nombres para no tener que usar el calificador Foo ::.

La función de uso

Se puede cargar un módulo llamando al use función.

#!/usr/bin/perl

use Foo;

bar( "a" );
blat( "b" );

Tenga en cuenta que no tuvimos que calificar completamente los nombres de las funciones del paquete. losuse La función exportará una lista de símbolos de un módulo dadas algunas declaraciones agregadas dentro de un módulo.

require Exporter;
@ISA = qw(Exporter);

Luego, proporcione una lista de símbolos (escalares, listas, hashes, subrutinas, etc.) llenando la variable de lista llamada @EXPORT: Por ejemplo -

package Module;

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);

sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" }  # Not exported!

1;

Crear el árbol de módulos de Perl

Cuando esté listo para enviar su módulo Perl, existe una forma estándar de crear un árbol de módulos Perl. Esto se hace usandoh2xsutilidad. Esta utilidad viene junto con Perl. Aquí está la sintaxis para usar h2xs:

$h2xs -AX -n  ModuleName

Por ejemplo, si su módulo está disponible en Person.pm archivo, luego simplemente emita el siguiente comando:

$h2xs -AX -n Person

Esto producirá el siguiente resultado:

Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST

Aquí está la descripción de estas opciones:

  • -A omite el código del autocargador (mejor utilizado por módulos que definen una gran cantidad de subrutinas utilizadas con poca frecuencia).

  • -X omite elementos XS (subrutina eXternal, donde eXternal significa externo a Perl, es decir, C).

  • -n especifica el nombre del módulo.

Entonces, el comando anterior crea la siguiente estructura dentro del directorio Person. El resultado real se muestra arriba.

  • Changes
  • Makefile.PL
  • MANIFEST (contiene la lista de todos los archivos del paquete)
  • README
  • t / (archivos de prueba)
  • lib / (el código fuente real va aquí

Así que finalmente tú taresta estructura de directorio en un archivo Person.tar.gz y puede enviarlo. Tendrá que actualizar el archivo README con las instrucciones adecuadas. También puede proporcionar algunos archivos de ejemplos de prueba en el directorio t.

Instalación del módulo Perl

Descargue un módulo de Perl en formato tar.gz archivo. Utilice la siguiente secuencia para instalar cualquier módulo PerlPerson.pm que se ha descargado como Person.tar.gz archivo.

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

El intérprete de Perl tiene una lista de directorios en los que busca módulos (matriz global @INC).