Comment utiliser sabu à partir d'un script Perl

De la tâche. Il y a un script dans un langage de programmation Perl. Celui-ci fixe une sorte de fonction (saba). Besoin de заиспользовать cette fonction dans un autre script.

Voici un exemple. Il y a un script script.pl qui définit saba header. Dans cette sabu передаешь la chaîne, et elle renvoie une chaîne au format markdown en-tête. Dans ce script, cette saba utilisé pour afficher les deux en-têtes:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

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

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

Courons perl script.pl et de voir à l'écran:

## ONE
## TWO

Tâche — créer un autre script other.pl qui sera également utiliser cette sabu.

Solution — copy-paste

Le plus simple (mais mauvaise) solution est tout simplement de copier le code de saba dans un autre script. Cette solution est obtenue c'est le genre de other.pl:

#!/usr/bin/perl

use feature qw(say);

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

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

say header('three');

Maintenant, vous pouvez exécuter ce script perl other.pl et de voir à l'écran le texte ## THREE.

C'est une solution au problème, mais c'est une mauvaise décision. À cause du fait que le même code est dans plusieurs fichiers, il devient difficile de travailler avec ce code. Lorsque vous avez besoin de modifier cette sabu, il faut la changer à plusieurs endroits, et encore besoin de ne pas oublier de changer code dans tous les bons fichiers).

Solution — de faire sabu dans un module séparé

La meilleure solution, c'est de supporter sabu dans un module séparé. Pour cela créons le fichier de 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; - a annoncé que c'est une "bibliothèque" Utils
  • use strict; et use warnings; — mettez le mode de Perl a été plus difficile à un bon code
  • 5 lignes de pro EXPORT indiquent que lors de la connexion de cette "bibliothèque" pour la fonction header a été disponible
  • déplacé ici la fonction
  • 1; — package doit toujours se terminer par la vérité

Après cette description de la fonction de script script.pl enlever, mais ajouter une connexion de la bibliothèque:

#!/usr/bin/perl

use feature qw(say);

use Utils;

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

Après cela, vous pouvez exécuter ce script avec la commande perl -Ilib/ script.pl. Le commutateur de ligne de commande -I transmettons valeur lib/ — le dossier dans lequel sera Perl trouver les bibliothèques. Le résultat de ce script est le même que précédemment.

Et maintenant, tout à fait trivial заиспользовать cette même sabu dans un autre script. Écrivons script other.pl, qui est pratiquement le même que script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Exécutez ce script perl -Ilib/ other.pl et de voir à l'écran ## THREE.

La décision — connecter le code du script dans le script

Il existe une autre solution que vous pouvez utiliser sabu définie dans le script script.pl заиспользовать dans le script other.pl. Pour cela, écrivons ce texte dans un fichier other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Exécutez le script perl other.pl (fichier other.pl doit être dans le même dossier que le script script.pl). Résultat:

## ONE
## TWO
## THREE

C'est-à-dire s'est avéré que lors de l'exécution d'un script other.pl on a d'abord effectué la totalité du code, qui a été dans script.pl (lignes ## ONE et ## TWO), puis l'exécution du code à partir d'un script other.pl (ligne ## THREE).

Pour lorsque vous exécutez le script other.pl n'a pas effectué une partie de script.pl nous avons besoin d'un peu modifier script.pl. Faut l'envelopper l'ensemble du code dans le corps du script sous condition et écrire à la fin du script l'unité de la véritable valeur de:

#!/usr/bin/perl

use feature qw(say);

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

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

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

1;

Maintenant, si nous courons perl script.pl, on obtient exactement la même conclusion que précédemment, et si lancerons perl other.pl, alors la sortie sera seul le texte ## THREE.

Le mot-clé caller retourne de différentes de la valeur en fonction de ce que a été lancé un script. À cette fonction que nous utilisons ici pour diviser l'exécution d'un script directement de la connexion d'un script à l'aide require.

Autres articles