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)