Ecrire des modules PERL

Que sont les packages?

  • Un package est une collection de code qui vit dans son propre espace de noms

  • Un espace de noms est une collection nommée de noms de variables uniques (également appelée table de symboles).

  • Les espaces de noms empêchent les collisions de noms de variables entre les packages

  • Les packages permettent la construction de modules qui, lorsqu'ils sont utilisés, ne clobbberont pas les variables et les fonctions en dehors de l'espace de noms des modules

La déclaration de package

  • instruction package bascule le contexte de dénomination actuel vers un espace de noms spécifié (table de symboles)

  • Si le package nommé n'existe pas, un nouvel espace de noms est d'abord créé.

$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
  • Le package reste en vigueur jusqu'à ce qu'une autre instruction package soit appelée, ou jusqu'à la fin de la fin du bloc ou du fichier en cours.

  • Vous pouvez explicitement faire référence à des variables dans un package en utilisant le :: qualificatif de package

$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"

Blocs BEGIN et END

Vous pouvez définir n'importe quel nombre de blocs de code nommés BEGIN et END qui agissent respectivement comme des constructeurs et des destructeurs.

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • Chaque BEGIN block est exécuté après le chargement et la compilation du script perl mais avant l'exécution de toute autre instruction

  • Chaque bloc END est exécuté juste avant la fermeture de l'interpréteur perl.

  • Les blocs BEGIN et END sont particulièrement utiles lors de la création de modules Perl.

Que sont les modules Perl?

Un module Perl est un package réutilisable défini dans un fichier bibliothèque dont le nom est le même que le nom du package (avec un .pm à la fin).

Un fichier de module Perl appelé "Foo.pm" peut contenir des instructions comme celle-ci.

#!/usr/bin/perl

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

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

Quelques points notables sur les modules

  • Les fonctions require et use chargera un module.

  • Les deux utilisent la liste des chemins de recherche dans @INC pour trouver le module (vous pouvez le modifier!)

  • Les deux appellent le eval fonction pour traiter le code

  • le 1; en bas, eval s'évalue à TRUE (et donc n'échoue pas)

La fonction Require

Un module peut être chargé en appelant le require fonction

#!/usr/bin/perl

require Foo;

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

Notez ci-dessus que les noms de sous-programmes doivent être pleinement qualifiés (car ils sont isolés dans leur propre package)

Ce serait bien d'activer l'importation de la barre de fonctions et du blat dans notre propre espace de noms pour ne pas avoir à utiliser le qualificatif Foo ::.

La fonction d'utilisation

Un module peut être chargé en appelant le use fonction

#!/usr/bin/perl

use Foo;

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

Notez que nous n'avons pas eu à qualifier complètement les noms de fonctions du package?

La fonction use exportera une liste de symboles d'un module à partir de quelques instructions ajoutées à l'intérieur d'un module

require Exporter;
@ISA = qw(Exporter);

Ensuite, fournissez une liste de symboles (scalaires, listes, hachages, sous-programmes, etc.) en remplissant la variable de liste nommée @EXPORT: Par exemple

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;

Créer l'arborescence des modules Perl

Lorsque vous êtes prêt à expédier votre module PERL, il existe un moyen standard de créer une arborescence de modules Perl. Ceci est fait en utilisanth2xsutilitaire. Cet utilitaire est fourni avec PERL. Voici la syntaxe pour utiliser 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

Voici la description de ces options

  • -A omet le code de l'Autoloader (mieux utilisé par les modules qui définissent un grand nombre de sous-programmes rarement utilisés)

  • -X omet les éléments XS (eXternal Subroutine, où eXternal signifie externe à Perl, c'est-à-dire C)

  • -n spécifie le nom du module

La commande ci-dessus crée la structure suivante dans le répertoire Person. Le résultat réel est indiqué ci-dessus.

  • Changes

  • Makefile.PL

  • MANIFEST (contient la liste de tous les fichiers du package)

  • README

  • t / (fichiers de test)

  • lib / (le code source réel va ici

Alors enfin toi tarcette structure de répertoire dans un fichier Person.tar et vous pouvez l'envoyer. Vous devrez mettre à jour le fichier README avec les instructions appropriées. Vous pouvez fournir des fichiers d'exemples de test dans le répertoire t.

Installer le module Perl

L'installation d'un module Perl est très simple. Utilisez la séquence suivante pour installer n'importe quel module Perl.

perl Makefile.PL
make
make install

L'interpréteur Perl a une liste de répertoires dans lesquels il recherche des modules (tableau global @INC)