Post on 30-Jun-2015
transcript
Parte 2
Programmazione modularein Perlin Perl
Linguaggi dinamici – A.A. 2009/20101
Introduzione� Il primo passo verso una attività di
programmazione che scali con il numero diprogrammazione che scali con il numero di righe di codice del software è l'isolamento delle funzionalità del software stessode e u o a tà de so t a e stesso
� Parti diverse del software“non si vedono” tra loro� “non si vedono” tra loro
� possono essere scritte indipendentemente da programmatori di ersiprogrammatori diversi
� possono essere cambiate concorrentemente
� Il Perl supporta la modularizzazione tramite i package ed i moduli
Linguaggi dinamici – A.A. 2009/20102
Package� Il package è un contenitore (namespace) di
simboli (funzioni variabili)simboli (funzioni, variabili)� Tipicamente, ad un package corrisponde un file
(non è sempre così)(non è sempre così)
� Il compilatore del Perl costruisce un namespace (contenitore di simboli) pernamespace (contenitore di simboli) per ciascun modulo
N di d f lt k i ( ti� Namespace di default: package main (contiene le funzioni eseguite dal programma principale)
� Il package contiene un puntatore ad una tabella dei simboli per il lookup di variabili,
Linguaggi dinamici – A.A. 2009/20103
funzioni, descrittori
Contenuto del package� Ciascuna variabile non espressamente
dichiarata con my è una variabile globale aldichiarata con my è una variabile globale al package� Tanto è vero che nel gergo del Perl non si� Tanto è vero che, nel gergo del Perl, non si
parla di variabili globali, bensì di variabili di packagepackage
� Lo scope di un package va:dalla dichiarazione del package� dalla dichiarazione del packagepackage nome_pacchetto;
All fi d l bl di di i i è t t� Alla fine del blocco di codice in cui è contenuta tale direttiva (tipicamente, la fine del file)
Linguaggi dinamici – A.A. 2009/20104
Scope del package� È possibile avere più (scope di) package nello
stesso filestesso file� Anche ripetuti
Esempio:� Esempio:� package A;
� $a = 5;
� package B;
� print $A::a;
� package A;� package A;
� print $a;
Linguaggi dinamici – A.A. 2009/20105
Accesso ai simboli del package� Il namespace assegnabile ad un package è una
sequenza di stringhe alfanumeriche separatasequenza di stringhe alfanumeriche separata dal simbolo ::� Time::Local My::Package Getopt::Long� Time::Local, My::Package, Getopt::Long
� I simboli di un package possono essere acceduti con la notazione completa:acceduti con la notazione completa:� Path::to::package::symbol;
� Si prepende al nome in notazione completa il simbolo della variabile$ ( l ) @ ( ) % (h h) & ( b)$ (scalar), @ (array), % (hash), & (sub)
� Attenzione: use strict; richiede che le variabili
Linguaggi dinamici – A.A. 2009/20106
di package siano dichiarate tali con our
Denominazione dei package� I nomi completi assegnati ai package non
vengono utilizzati per dedurre relazionivengono utilizzati per dedurre relazioni esplicite (sottoclassi, altro)� package Red;� package Red;
� package Red::Blue;
I d k R d R d Bl i� I due package Red e Red::Blue non sono in alcun modo collegati fra loro
Si d l i l� Si deve usare la notazione completa, sempre:
� $Red::Blue::foo;
� Il package di default è main (o $)� $::foo è equivalente a $main::foo
Linguaggi dinamici – A.A. 2009/20107
� $::foo è equivalente a $main::foo
Un package speciale – main� Il package main è speciale, nel senso che è
l'unico package a poter usufruire delle variabilil unico package a poter usufruire delle variabili speciali (perldoc perlvar)� $!: il valore della variabile errno (glibc)� $!: il valore della variabile errno (glibc)
� $?: stringa di errore riportata da programma esternoesterno
� $_: la variabile di default
$/ il t i t di i di d f lt� $/: il terminatore di riga di default
� STDIN, STDOUT, STDERR: descrittori di file associati al processo
� @ARGV: l'array degli argomenti
Linguaggi dinamici – A.A. 2009/20108
� %ENV: l'ambiente di shell
Tabella dei simboli� L'insieme dei simboli (variabili, funzioni)
contenuti in un package è memorizzato nellacontenuti in un package è memorizzato nella tabella dei simboli
La tabella dei simboli è memorizzata in una� La tabella dei simboli è memorizzata in una hash avente lo stesso nome del package, terminato con ::terminato con ::� %MyPackage::, %main::
� La tabella dei simboli non viene solitamente acceduta direttamente dal programmatore
Linguaggi dinamici – A.A. 2009/20109
Lookup tabella dei simboli� Quando si scrive print $foo; viene scatenata la
sequenza di operazioni riportata di seguitosequenza di operazioni riportata di seguito� Il perl controlla se esiste una variabile lessicale
(my) di nome foo(my) di nome foo
� Se non esiste, si cerca il simbolo foo nella tabella dei simboli del package attualetabella dei simboli del package attuale
Linguaggi dinamici – A.A. 2009/201010
Simboli con stesso nome e tipo diverso� Si è detto che le tabelle dei simboli sono
implementate con delle hashimplementate con delle hash
� Inoltre, variabili di tipo diverso possono avere lo stesso nome:lo stesso nome:� $foo, @foo, %foo
� Come fa la tabella dei simboli a differenziare fra variabili di tipo diverso e stesso nome?� Le hash devono avere chiavi univoche
Linguaggi dinamici – A.A. 2009/201011
Typeglob� Tale problema si risolve con i typeglob
Un typeglob (identificato con il simbolo *)� Un typeglob (identificato con il simbolo *) raggruppa tutti i simboli che hanno lo stesso nomenome� *foo rappresenta $foo (scalar), @foo (array),
%f (h h) &f (f ti ) f (fil h dl )%foo (hash), &foo (function), foo (filehandle)
� *foo è una struttura dati contenente celle di i i d i i b li tmemoria per ciascuno dei simboli avente nome
foo
Linguaggi dinamici – A.A. 2009/201012
Includere un file esterno� È possibile includere il contenuto di un file
esterno con la funzione requireesterno con la funzione require
� Il successo dell’inclusione è dato dal valore dell’ultimo statement del file inclusodell ultimo statement del file incluso� Si usa terminare il file da includere con 1;
� require può accettare come parametro:� Una stringa costante che rappresenta il nome
del file
� Una espressione che, valutata, rappresenta il p , , ppnome del file
� Un nome, che viene interpretato come modulo
Linguaggi dinamici – A.A. 2009/201013
, p
Modulo� Il modulo è l'unità di base per il riuso di codice
Un modulo è un package� Un modulo è un package� contenuto in un file che ha lo stesso nome del
k ( d il ffi )package (ed il suffisso .pm)
� che termina con l'espressione vera 1;
� Ad esempio: file Foo.pm
package Foo;package Foo;
# sub, var, …
1;1;
Linguaggi dinamici – A.A. 2009/201014
Uso di un modulo� Un programma Perl “usa” un modulo
specificandolo con la funzione usespecificandolo con la funzione use� use Time::Local;
È sufficiente il nome del modulo senza� È sufficiente il nome del modulo, senza estensione .pmIn questo modo è possibile utilizzare i simboli� In questo modo è possibile utilizzare i simboli (variabili, funzioni, …) nel programma (o modulo) che lo usamodulo) che lo usa
Linguaggi dinamici – A.A. 2009/201015
use vs. require� use è molto più utilizzato rispetto a require
Controlla l’esistenza del modulo a tempo di� Controlla l esistenza del modulo a tempo di compilazione
� Più flessibile nella gestione dei simboli� Più flessibile nella gestione dei simboli
� Corrisponde aBEGIN { req ire Mod le Mod le >import( LIST ) }� BEGIN { require Module; Module->import( LIST ); }
� Ma:( )� use serve solo per i moduli (estensione .pm),
require per file (Perl) qualsiasiè t i bil i ò� use non è parametrizzabile, non si può usare
una variabile (è eseguita a tempo di compilazione)
Linguaggi dinamici – A.A. 2009/201016
compilazione)
Esportazione dei simboli� Alcuni simboli possono essere esportati agli
altri moduli o programmi che ne faranno usoaltri moduli o programmi che ne faranno uso� Un modulo non avrebbe molto senso, senza tali
simbolisimboli
� Tali simboli possono essere referenziati negli altri moduli con la notazione breve (quellaaltri moduli con la notazione breve (quella solita, $foo, @foo, …)
S� Si usa il modulo di base Exporter� Implementa una funzione import appropriata
Linguaggi dinamici – A.A. 2009/201017
All'interno del modulo� Si definisce il package
Si importa il modulo Exporter� Si importa il modulo Exporter
� require Exporter;
� Si fa diventare il nostro modulo una sottoclasse di Exporter
� our @ISA = “Exporter”;
� Si definiscono le tipologie di oggetti da� Si definiscono le tipologie di oggetti da esportare, all'interno di opportuni array
Linguaggi dinamici – A.A. 2009/201018
All'interno del modulo� our @EXPORT: array di simboli sempre
esportati dal moduloesportati dal modulo
� our @EXPORT_OK: array di simboli esportati su richiesta del modulo che importasu richiesta del modulo che importa
� our %EXPORT_TAGS: hash di chiavi che t i di i b li t bilirappresentano gruppi di simboli esportabili
� I simboli devono apparire anche in EXPORT o EXPORT_OK
Linguaggi dinamici – A.A. 2009/201019
All'esterno del modulo� Il programma importa il modulo
use Foo;� use Foo;
� Tutti i simboli esportati tramite @EXPORT sono ià i ibili di tt tgià visibili direttamente
� Il programma importa il modulo� use Foo qw(simbolo1 simbolo2);
� Si richiede l‘importazione dei simboli simbolo1 pe simbolo2
� Il programma importa il moduloIl programma importa il modulo� use Foo qw(simbolo_inesistente);
Errore: simbolo inesistente non esisteLinguaggi dinamici – A.A. 2009/2010
20
� Errore: simbolo_inesistente non esiste
All'esterno del modulo� Il programma importa il modulo
use Foo qw(:tag);� use Foo qw(:tag);
� Vengono importati tutti i simboli esportati t it l hi t i @EXPORT TAGStramite la chiave tag in @EXPORT_TAGS
� Il programma importa il modulo� use Foo qw(/pattern/);
� Vengono importati tutti i simboli che fanno match con pattern (espressione regolare)
� È anche possibile chiedere di non importare un p psimbolo� Uso dell’operatore !
Linguaggi dinamici – A.A. 2009/201021
� Uso dell operatore !