Scrittura di moduli PERL

Cosa sono i pacchetti?

  • Un pacchetto è una raccolta di codice che risiede nel proprio spazio dei nomi

  • Uno spazio dei nomi è una raccolta denominata di nomi di variabili univoci (chiamata anche tabella dei simboli).

  • Gli spazi dei nomi prevengono i conflitti di nomi di variabili tra i pacchetti

  • I pacchetti consentono la costruzione di moduli che, se usati, non ostruiscono variabili e funzioni al di fuori dello spazio dei nomi dei moduli

La dichiarazione del pacchetto

  • L'istruzione package cambia il contesto dei nomi corrente in uno spazio dei nomi specificato (tabella dei simboli)

  • Se il pacchetto denominato non esiste, viene prima creato un nuovo spazio dei nomi.

$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
  • Il pacchetto rimane attivo fino a quando non viene richiamata un'altra istruzione del pacchetto o fino alla fine della fine del blocco o del file corrente.

  • È possibile fare riferimento esplicito alle variabili all'interno di un pacchetto utilizzando il :: qualificatore del pacchetto

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

Blocchi BEGIN e END

È possibile definire un numero qualsiasi di blocchi di codice denominati BEGIN e END che agiscono rispettivamente come costruttori e distruttori.

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • Ogni BEGIN block viene eseguito dopo che lo script perl è stato caricato e compilato ma prima che venga eseguita qualsiasi altra istruzione

  • Ogni blocco END viene eseguito appena prima che l'interprete perl esca.

  • I blocchi BEGIN e END sono particolarmente utili quando si creano moduli Perl.

Cosa sono i moduli Perl?

Un modulo Perl è un pacchetto riutilizzabile definito in un file di libreria il cui nome è lo stesso del nome del pacchetto (con un .pm alla fine).

Un file di modulo Perl chiamato "Foo.pm" potrebbe contenere istruzioni come questa.

#!/usr/bin/perl

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

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

Pochi punti notevoli sui moduli

  • Le funzioni require e use caricherà un modulo.

  • Entrambi usano l'elenco dei percorsi di ricerca in @INC per trovare il modulo (puoi modificarlo!)

  • Entrambi chiamano il eval funzione per elaborare il codice

  • Il 1; in basso fa sì che eval restituisca TRUE (e quindi non fallisca)

La funzione Richiedi

Un modulo può essere caricato chiamando il file require funzione

#!/usr/bin/perl

require Foo;

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

Si noti sopra che i nomi delle subroutine devono essere completamente qualificati (perché sono isolati nel proprio pacchetto)

Sarebbe bello abilitare la barra delle funzioni e blat da importare nel nostro spazio dei nomi in modo da non dover usare il qualificatore Foo ::.

La funzione Use

Un modulo può essere caricato chiamando il file use funzione

#!/usr/bin/perl

use Foo;

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

Notate che non dovevamo qualificare completamente i nomi delle funzioni del pacchetto?

La funzione use esporterà un elenco di simboli da un modulo dato alcune istruzioni aggiunte all'interno di un modulo

require Exporter;
@ISA = qw(Exporter);

Quindi, fornire un elenco di simboli (scalari, elenchi, hash, subroutine, ecc.) Compilando la variabile di elenco denominata @EXPORT: Per esempio

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;

Crea l'albero dei moduli Perl

Quando sei pronto per spedire il tuo modulo PERL, c'è un modo standard per creare un albero del modulo Perl. Questo viene fatto usandoh2xsutilità. Questa utility viene fornita con PERL. Ecco la sintassi per usare 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

Ecco la descrizione di queste opzioni

  • -A omette il codice del caricatore automatico (utilizzato al meglio dai moduli che definiscono un gran numero di subroutine usate raramente)

  • -X omette gli elementi XS (eXternal Subroutine, dove eXternal significa esterno a Perl, cioè C)

  • -n specifica il nome del modulo

Quindi il comando sopra crea la seguente struttura all'interno della directory Person. Il risultato effettivo è mostrato sopra.

  • Changes

  • Makefile.PL

  • MANIFEST (contiene l'elenco di tutti i file nel pacchetto)

  • README

  • t / (file di prova)

  • lib / (Il codice sorgente effettivo va qui

Quindi finalmente tu tarquesta struttura di directory in un file Person.tar e puoi inviarlo. Dovresti aggiornare il file README con le istruzioni appropriate. È possibile fornire alcuni file di esempi di test nella directory t.

Installazione del modulo Perl

Installare un modulo Perl è molto semplice. Utilizzare la seguente sequenza per installare qualsiasi modulo Perl.

perl Makefile.PL
make
make install

L'interprete Perl ha un elenco di directory in cui cerca i moduli (array globale @INC)