Pe t3 perl-moduli

21
Parte 2 Programmazione modulare in Perl in Perl Linguaggi dinamici – A.A. 2009/2010 1

Transcript of Pe t3 perl-moduli

Page 1: Pe t3 perl-moduli

Parte 2

Programmazione modularein Perlin Perl

Linguaggi dinamici – A.A. 2009/20101

Page 2: Pe t3 perl-moduli

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

Page 3: Pe t3 perl-moduli

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

Page 4: Pe t3 perl-moduli

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

Page 5: Pe t3 perl-moduli

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

Page 6: Pe t3 perl-moduli

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

Page 7: Pe t3 perl-moduli

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

Page 8: Pe t3 perl-moduli

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

Page 9: Pe t3 perl-moduli

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

Page 10: Pe t3 perl-moduli

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

Page 11: Pe t3 perl-moduli

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

Page 12: Pe t3 perl-moduli

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

Page 13: Pe t3 perl-moduli

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

Page 14: Pe t3 perl-moduli

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

Page 15: Pe t3 perl-moduli

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

Page 16: Pe t3 perl-moduli

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)

Page 17: Pe t3 perl-moduli

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

Page 18: Pe t3 perl-moduli

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

Page 19: Pe t3 perl-moduli

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

Page 20: Pe t3 perl-moduli

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

Page 21: Pe t3 perl-moduli

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 !