Escribir módulos PERL
¿Qué son los paquetes?
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 usan, no golpearán variables y funciones fuera del propio espacio de nombres de los módulos.
La declaración del paquete
la declaración del paquete cambia el contexto de nomenclatura actual a un espacio de nombres especificado (tabla de símbolos) Si el paquete con nombre no existe, primero se crea un nuevo espacio de nombres.
$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
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
$PACKAGE_NAME::VARIABLE_NAME
For Example:
$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
print "$foo::i\n"; # Prints "2"
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 de 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.
¿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 del paquete (con un .pm al final).
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;
Pocos puntos notables sobre los módulos
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 (¡puede modificarlo!)
Ambos llaman al 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 función
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
Tenga en cuenta que los nombres de las subrutinas deben estar completamente calificados (porque están aislados en su propio paquete)
Sería bueno permitir que la barra de funciones y blat se importen a nuestro propio espacio de nombres para que no tengamos 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" );
¿Observa que no tuvimos que calificar completamente los nombres de las funciones del paquete?
La función de uso 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 Module Name
# For example, if your module is available in Person.pm file
$h2xs -AX -n Person
This will produce following result
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í
Entonces finalmente tu taresta estructura de directorio en un archivo Person.tar y puede enviarlo. Debería actualizar el archivo README con las instrucciones adecuadas. Puede proporcionar algunos archivos de ejemplos de prueba en el directorio t.
Instalación del módulo Perl
Instalar un módulo Perl es muy fácil. Utilice la siguiente secuencia para instalar cualquier módulo Perl.
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)