Cómo utilizar sabu de script de Perl

La tarea. Hay un script en el lenguaje de programación Perl. En él se define una función (saba). Es necesario заиспользовать esta función en otro script.

He aquí un ejemplo. Hay un script script.pl en el que se define saba header. En este sabu передаешь la cadena, y devuelve la cadena en forma de markdown título. Este script esta saba se utiliza para mostrar en pantalla los siguientes títulos:

▶ Run
#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('one');
say header('two');

Ponemos en marcha la perl script.pl y vemos en la pantalla:

## ONE
## TWO

La tarea de crear otro script other.pl que también se va a utilizar este sabu.

Solución — copy-paste

La más sencilla (pero mal), una solución es copiar y pegar el código sabi en otro script. Esta solución resulta he aquí un other.pl:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('three');

Ahora puede ejecutar este script perl other.pl y ver en la pantalla de texto ## THREE.

Es la solución de la tarea, pero es una mala decisión. Debido a que el mismo código se encuentra en varios archivos, se hace difícil trabajar con este código. Cuando tengas que cambiar este sabu, algo tiene que cambiar en unos pocos lugares (y aún será necesario no olvidar cambiar el código de todos los archivos).

Solución — formular sabu en un módulo independiente

Más la decisión correcta, es la de soportar el sabu en un módulo independiente. Para ello creamos el archivo lib/Utils.pm:

package Utils;

use strict;
use warnings;

use Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
    header
);
our @EXPORT = @EXPORT_OK;

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

1;
  • package Utils; - anunciaron que se trata de "la biblioteca" Utils
  • use strict; y use warnings; — incluye un modo para Perl fue más exigente a un buen código
  • 5 líneas sobre EXPORT indican que cuando se conecta de esta "biblioteca" es necesario para la función de header estaba disponible
  • trasladó aquí la función de
  • 1; — package siempre debe terminar con la verdad

Después de esta descripción de la función de la secuencia de comandos script.pl de eliminar, pero se agrega la conexión de la biblioteca:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('one');
say header('two');

Después de esto, puede ejecutar este script con el comando perl -Ilib/ script.pl. En la clave de la línea de comandos -I transmitiendo el valor de la lib/ — carpeta en la que se Perl buscar en la biblioteca. El resultado del trabajo de este script es la misma que antes.

Y ahora es completamente trivial заиспользовать este mismo sabu en otro script. Escribimos el script other.pl, que es prácticamente el mismo como script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Ejecute este script perl -Ilib/ other.pl y vemos en la pantalla ## THREE.

La solución es conectar el código de script en el script

Hay todavía una decisión de cómo se puede utilizar sabu definida en el script script.pl заиспользовать en el script other.pl. Para ello, escribimos un texto en un archivo other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Ejecutar el script perl other.pl (archivo other.pl debe estar en la misma carpeta que el script script.pl). El resultado:

## ONE
## TWO
## THREE

Es decir, ha resultado que si se ejecuta el script other.pl primero se ha ejecutado todo el código que fue en script.pl (línea ## ONE y ## TWO), y luego ejecuta el código del script other.pl (línea ## THREE).

Para cuando se ejecuta el script other.pl no se ha ejecutado una parte de la script.pl necesitamos un poco de cambiar script.pl. Tiene que envolver todo el código en el cuerpo del script bajo la condición de insertar al final del script la unidad como valor verdadero:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

if ( not caller() ) {
    say header('one');
    say header('two');
}

1;

Ahora si ejecutamos perl script.pl, obtenemos exactamente la misma pantalla de antes, y si ejecutamos perl other.pl, entonces la salida será solamente el texto nos ## THREE.

La palabra clave caller devuelve el diferente valor dependiendo de cómo se inició la secuencia de comandos. Este фичу utilizamos aquí para dividir la ejecución de un script directamente de la conexión de un script con el uso de require.

Otros articulos