SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
Parte 2




       Programmazione modulare
               in Perl




Linguaggi dinamici – A.A. 2009/2010
                                      1
Introduzione
T   Il primo passo verso una attività di
    programmazione che scali con il numero di
    righe di codice del software è l'isolamento
    de e u o a tà del so t a e
    delle funzionalità de software stesso
T   Parti diverse del software
      T   “non si vedono” tra loro
      T   possono essere scritte indipendentemente da
          programmatori diversi
                        di ersi
      T   possono essere cambiate concorrentemente
T   Il Perl supporta la modularizzazione tramite i
    package ed i moduli
Linguaggi dinamici – A.A. 2009/2010
                                                        2
Package
T   Il package è un contenitore (namespace) di
    simboli (funzioni, variabili)
            (funzioni
      T   Tipicamente, ad un package corrisponde un file
          (non è sempre così)
T   Il compilatore del Perl costruisce un
    namespace (contenitore di simboli) per
    ciascun modulo
      T   Namespace di default: package main (
          N              d f lt       k     i (contiene
                                                   ti
          le funzioni eseguite dal programma principale)
T   Il package contiene un puntatore ad una
    tabella dei simboli per il lookup di variabili,
    funzioni, descrittori
Linguaggi dinamici – A.A. 2009/2010
                                                           3
Contenuto del package
T   Ciascuna variabile non espressamente
    dichiarata con my è una variabile globale al
    package
      T   Tanto è vero che nel gergo del Perl non si
                        che,                 Perl,
          parla di variabili globali, bensì di variabili di
          package
T   Lo scope di un package va:
      T   dalla dichiarazione del package
          package nome_pacchetto;
      T   Alla fi d l bl
          All fine del blocco di codice in cui è contenuta
                                    di i        i        t t
          tale direttiva (tipicamente, la fine del file)

Linguaggi dinamici – A.A. 2009/2010
                                                               4
Scope del package
T   È possibile avere più (scope di) package nello
    stesso file
T   Anche ripetuti
T   Esempio:
     T   package A;
     T   $a = 5;
     T   package B;
     T   print $A::a;
     T   package A;
     T   print $a;

Linguaggi dinamici – A.A. 2009/2010
                                                     5
Accesso ai simboli del package
T   Il namespace assegnabile ad un package è una
    sequenza di stringhe alfanumeriche separata
    dal simbolo ::
      T   Time::Local, My::Package
          Time::Local My::Package, Getopt::Long
T   I simboli di un package possono essere
    acceduti con la notazione completa:
      T   Path::to::package::symbol;
      T   Si prepende al nome in notazione completa il
          simbolo della variabile
          $((scalar), @ (array), % (h h) & ( b)
                l )     (     )    (hash), (sub)
T   Attenzione: use strict; richiede che le variabili
    di package siano dichiarate tali con our
Linguaggi dinamici – A.A. 2009/2010
                                                         6
Denominazione dei package
T   I nomi completi assegnati ai package non
    vengono utilizzati per dedurre relazioni
    esplicite (sottoclassi, altro)
      T   package Red;
      T   package Red::Blue;
      T   I due package Red e Red::Blue non sono i
            d      k    R d R d Bl               in
          alcun modo collegati fra loro
T   Si deve usare la notazione completa, sempre:
        d          l       i           l
     T $Red::Blue::foo;


T   Il package di default è main (o $)
      T   $::foo è equivalente a $main::foo
Linguaggi dinamici – A.A. 2009/2010
                                                      7
Un package speciale – main
T   Il package main è speciale, nel senso che è
    l unico
    l'unico package a poter usufruire delle variabili
    speciali (perldoc perlvar)
      T   $!: il valore della variabile errno (glibc)
      T   $?: stringa di errore riportata da programma
          esterno
      T   $_: la variabile di default
      T   $/: t
          $/ il terminatore di riga di default
                     i t         i      d f lt
      T   STDIN, STDOUT, STDERR: descrittori di file
          associati al processo
      T   @ARGV: l'array degli argomenti
      T   %ENV: l'ambiente di shell
Linguaggi dinamici – A.A. 2009/2010
                                                         8
Tabella dei simboli
T   L'insieme dei simboli (variabili, funzioni)
    contenuti in un package è memorizzato nella
    tabella dei simboli
T   La tabella dei simboli è memorizzata in una
    hash avente lo stesso nome del package,
    terminato con ::
      T   %MyPackage::, %main::
T   La tabella dei simboli non viene solitamente
    acceduta direttamente dal programmatore



Linguaggi dinamici – A.A. 2009/2010
                                                   9
Lookup tabella dei simboli
T   Quando si scrive print $foo; viene scatenata la
    sequenza di operazioni riportata di seguito
      T   Il perl controlla se esiste una variabile lessicale
          (my) di nome foo
      T   Se non esiste, si cerca il simbolo foo nella
          tabella dei simboli del package attuale




Linguaggi dinamici – A.A. 2009/2010
                                                                10
Simboli con stesso nome e tipo diverso
T   Si è detto che le tabelle dei simboli sono
    implementate con delle hash
T   Inoltre, variabili di tipo diverso possono avere
    lo stesso nome:
      T   $foo, @foo, %foo
T   Come fa la tabella dei simboli a differenziare
    fra variabili di tipo diverso e stesso nome?
      T   Le hash devono avere chiavi univoche




Linguaggi dinamici – A.A. 2009/2010
                                                       11
Typeglob
T   Tale problema si risolve con i typeglob
T   Un typeglob (identificato con il simbolo *)
    raggruppa tutti i simboli che hanno lo stesso
    nome
      T   *foo rappresenta $foo (scalar), @foo (array),
          %foo (hash), &f (function), f (fil h dl )
          %f (h h) &foo (f         ti ) foo (filehandle)
      T   *foo è una struttura dati contenente celle di
          memoria per ciascuno dei simboli avente nome
                 i       i        d i i b li       t
          foo




Linguaggi dinamici – A.A. 2009/2010
                                                           12
Includere un file esterno
T   È possibile includere il contenuto di un file
    esterno con la funzione require
T   Il successo dell’inclusione è dato dal valore
    dell ultimo
    dell’ultimo statement del file incluso
     T   Si usa terminare il file da includere con 1;
T   require può accettare come parametro:
     T   Una stringa costante che rappresenta il nome
         del file
     T   Una espressione che, valutata, rappresenta il
                  p          ,        , pp
         nome del file
     T   Un nome, che viene interpretato come modulo
                    ,            p
Linguaggi dinamici – A.A. 2009/2010
                                                         13
Modulo
T   Il modulo è l'unità di base per il riuso di codice
T   Un modulo è un package
      T   contenuto in un file che ha lo stesso nome del
          package ( d il suffisso .pm)
             k    (ed      ffi       )
      T   che termina con l'espressione vera 1;
T  Ad esempio: file Foo.pm
package Foo;
# sub, var, …
1;


Linguaggi dinamici – A.A. 2009/2010
                                                           14
Uso di un modulo
T   Un programma Perl “usa” un modulo
    specificandolo con la funzione use
     T   use Time::Local;
T   È sufficiente il nome del modulo senza
                               modulo,
    estensione .pm
T   In questo modo è possibile utilizzare i simboli
    (variabili, funzioni, …) nel programma (o
    modulo) che lo usa




Linguaggi dinamici – A.A. 2009/2010
                                                      15
use vs. require
T   use è molto più utilizzato rispetto a require
     T   Controlla l esistenza del modulo a tempo di
                   l’esistenza
         compilazione
     T   Più flessibile nella gestione dei simboli
T   Corrisponde a
     T   BEGIN { req ire Mod le Mod le >import( LIST ); }
                 require Module; Module->import(     )
T   Ma:
     T   use serve solo per i moduli ( (estensione .pm),
                                                      )
         require per file (Perl) qualsiasi
     T   use non è parametrizzabile, non si può usare
                            ti     bil       i  ò
         una variabile (è eseguita a tempo di
         compilazione)
Linguaggi dinamici – A.A. 2009/2010
                                                            16
Esportazione dei simboli
T   Alcuni simboli possono essere esportati agli
    altri moduli o programmi che ne faranno uso
      T   Un modulo non avrebbe molto senso, senza tali
          simboli
T   Tali simboli possono essere referenziati negli
    altri moduli con la notazione breve (quella
    solita, $foo, @foo, …)
T   Si
    S usa il modulo di base Exporter
     T    Implementa una funzione import appropriata



Linguaggi dinamici – A.A. 2009/2010
                                                          17
All'interno del modulo
T   Si definisce il package
T   Si importa il modulo Exporter
     T require Exporter;


T   Si fa diventare il nostro modulo una
    sottoclasse di Exporter
     T our @ISA = “Exporter”;


T   Si definiscono le tipologie di oggetti da
    esportare, all'interno di opportuni array



Linguaggi dinamici – A.A. 2009/2010
                                                18
All'interno del modulo
T   our @EXPORT: array di simboli sempre
    esportati dal modulo
T   our @EXPORT_OK: array di simboli esportati
    su richiesta del modulo che importa
T   our %EXPORT_TAGS: hash di chiavi che
    rappresentano gruppi di simboli esportabili
               t         i    i b li     t bili
     T   I simboli devono apparire anche in EXPORT o
         EXPORT_OK




Linguaggi dinamici – A.A. 2009/2010
                                                       19
All'esterno del modulo
T   Il programma importa il modulo
      T   use Foo;
      T   Tutti i simboli esportati tramite @EXPORT sono
          già visibili di tt
           ià i ibili direttamente
                                 t
T   Il programma importa il modulo
      T   use Foo qw(simbolo1 simbolo2);
      T   Si richiede l‘importazione dei simboli simbolo1
                          p
          e simbolo2
T   Il programma importa il modulo
      T   use Foo qw(simbolo_inesistente);
      T   Errore: simbolo inesistente non esiste
                  simbolo_inesistente
Linguaggi dinamici – A.A. 2009/2010
                                                            20
All'esterno del modulo
T    Il programma importa il modulo
      T   use Foo qw(:tag);
      T   Vengono importati tutti i simboli esportati
          tramite la chiave t i @EXPORT_TAGS
          t   it l hi       tag in @EXPORT TAGS
T    Il programma importa il modulo
      T   use Foo qw(/pattern/);
      T   Vengono importati tutti i simboli che fanno
          match con pattern (espressione regolare)
 T   È anche possibile chiedere di non importare un
             p                           p
     simbolo
      T   Uso dell’operatore !
              dell operatore
Linguaggi dinamici – A.A. 2009/2010
                                                        21

Más contenido relacionado

La actualidad más candente

Py a3 python-metaprogramming
Py a3 python-metaprogrammingPy a3 python-metaprogramming
Py a3 python-metaprogrammingMajong DevJfu
 
Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-databaseMajong DevJfu
 
Pe a2 perl-documentazione
Pe a2 perl-documentazionePe a2 perl-documentazione
Pe a2 perl-documentazioneMajong DevJfu
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - TheoryNaLUG
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMobileSchool
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope VariabiliMajong DevJfu
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimentiMajong DevJfu
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio cughetta
 

La actualidad más candente (20)

Py a3 python-metaprogramming
Py a3 python-metaprogrammingPy a3 python-metaprogramming
Py a3 python-metaprogramming
 
Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-database
 
Pe t4 perl-oggetti
Pe t4 perl-oggettiPe t4 perl-oggetti
Pe t4 perl-oggetti
 
Pe a2 perl-documentazione
Pe a2 perl-documentazionePe a2 perl-documentazione
Pe a2 perl-documentazione
 
2006 Py04 avanzato
2006 Py04 avanzato2006 Py04 avanzato
2006 Py04 avanzato
 
T3 esempio runtime
T3 esempio runtimeT3 esempio runtime
T3 esempio runtime
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
11 I File
11   I File11   I File
11 I File
 
2006 Py01 intro
2006 Py01 intro2006 Py01 intro
2006 Py01 intro
 
T4 tipizzazione
T4 tipizzazioneT4 tipizzazione
T4 tipizzazione
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - Theory
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partI
 
Inferno Limbo Italian
Inferno Limbo ItalianInferno Limbo Italian
Inferno Limbo Italian
 
T6 codice
T6 codiceT6 codice
T6 codice
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
Gcc & Make
Gcc & MakeGcc & Make
Gcc & Make
 

Destacado

Corso Python Django
Corso Python DjangoCorso Python Django
Corso Python Djangobarmassimo
 
Sviluppo di applicazioni web con Django
Sviluppo di applicazioni web con DjangoSviluppo di applicazioni web con Django
Sviluppo di applicazioni web con DjangoMauro Barattin
 
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testingMajong DevJfu
 
Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingMajong DevJfu
 
Py a1 python-unit_testing
Py a1 python-unit_testingPy a1 python-unit_testing
Py a1 python-unit_testingMajong DevJfu
 
9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 

Destacado (11)

Corso Python Django
Corso Python DjangoCorso Python Django
Corso Python Django
 
Sviluppo di applicazioni web con Django
Sviluppo di applicazioni web con DjangoSviluppo di applicazioni web con Django
Sviluppo di applicazioni web con Django
 
UE week 2
UE week 2UE week 2
UE week 2
 
T2 architettura
T2 architetturaT2 architettura
T2 architettura
 
T8 supporti
T8 supportiT8 supporti
T8 supporti
 
T1 introduzione
T1 introduzioneT1 introduzione
T1 introduzione
 
T5 memoria
T5 memoriaT5 memoria
T5 memoria
 
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testing
 
Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogramming
 
Py a1 python-unit_testing
Py a1 python-unit_testingPy a1 python-unit_testing
Py a1 python-unit_testing
 
9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 

Más de Majong DevJfu

8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 
25 architectural adaptation
25 architectural adaptation25 architectural adaptation
25 architectural adaptationMajong DevJfu
 

Más de Majong DevJfu (20)

8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 
25 architectural adaptation
25 architectural adaptation25 architectural adaptation
25 architectural adaptation
 

Pe t3 perl-moduli

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