Perl - Pacchetti e moduli

Cosa sono i pacchetti?

Il packageL'istruzione cambia il contesto dei nomi corrente in uno spazio dei nomi specificato (tabella dei simboli). Quindi -

  • 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 sovrascriveranno variabili e funzioni al di fuori dello spazio dei nomi dei moduli.

  • Il pacchetto rimane attivo finché non viene richiamata un'altra istruzione del pacchetto o fino alla fine del blocco o del file corrente.

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

Di seguito è riportato un esempio con i pacchetti main e Foo in un file. Qui è stata usata la variabile speciale __PACKAGE__ per stampare il nome del pacchetto.

#!/usr/bin/perl

# This is main package
$i = 1; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package Foo;
# This is Foo package
$i = 10; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package main;
# This is again main package
$i = 100; 
print "Package name : " , __PACKAGE__ , " $i\n"; 
print "Package name : " , __PACKAGE__ ,  " $Foo::i\n"; 

1;

Quando viene eseguito il codice sopra, produce il seguente risultato:

Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10

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.

L'esempio seguente mostra il suo utilizzo:

#!/usr/bin/perl

package Foo;
print "Begin and Block Demo\n";

BEGIN { 
   print "This is BEGIN Block\n" 
}

END { 
   print "This is END Block\n" 
}

1;

Quando viene eseguito il codice sopra, produce il seguente risultato:

This is BEGIN Block
Begin and Block Demo
This is END Block

Cosa sono i moduli Perl?

Un modulo Perl è un pacchetto riutilizzabile definito in un file di libreria il cui nome è uguale al nome del pacchetto con estensione .pm.

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

#!/usr/bin/perl

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

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

Pochi punti importanti sui moduli Perl

  • Le funzioni require e use caricherà un modulo.

  • Entrambi usano l'elenco dei percorsi di ricerca in @INC per trovare il modulo.

  • Entrambe le funzioni require e use chiama il eval funzione per elaborare il codice.

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

La funzione Richiedi

Un modulo può essere caricato chiamando il file require funzionare come segue:

#!/usr/bin/perl

require Foo;

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

Avrai notato che i nomi delle subroutine devono essere pienamente qualificati per chiamarli. Sarebbe bello abilitare la subroutinebar e blat da importare nel nostro spazio dei nomi in modo da non dover utilizzare 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" );

Si noti che non è stato necessario qualificare completamente i nomi delle funzioni del pacchetto. Iluse funzione 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: Ad 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, esiste 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  ModuleName

Ad esempio, se il tuo modulo è disponibile in Person.pm file, quindi emetti semplicemente il seguente comando:

$h2xs -AX -n Person

Questo produrrà il seguente risultato:

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 di rado).

  • -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.gz e puoi inviarlo. Dovrai aggiornare il file README con le istruzioni appropriate. È inoltre possibile fornire alcuni file di esempi di test nella directory t.

Installazione del modulo Perl

Scarica un modulo Perl nel file tar.gz. Utilizzare la seguente sequenza per installare qualsiasi modulo PerlPerson.pm che è stato scaricato in formato Person.tar.gz file.

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

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