2. Parte 2
Introduzione al Perl
Linguaggi dinamici – A.A. 2009/2010
2
3. Un po’ di storia
T PERL: acronimo di Practical Extraction Report
Language
T Nasce nel 1986, come un insieme di strumenti
per la gestione della configurazione di un
server USENET
T Autore: L
A t Larry Wall
W ll
T 1987: V1.0
T 1999: V5.003 (milestone release)
T 2008: V5 10
V5.10
T Perl6 (radicalmente diverso da V5.10) è in fase
di standardizzazione
Linguaggi dinamici – A.A. 2009/2010
3
4. Caratteristiche
T Sintassi estremamente ricca e variegata
T Motto del Perl: “There is more than one way to
do it” (TIMTOWTDI)
T Supporto eccellente per la manipolazione di
S t ll t l i l i
testi (espressioni regolari del Perl)
T Include diversi comandi di shell come builtin
T Molto liberale nei costrutti e nella tipizzazione
p
T Archivio di moduli sconfinato (CPAN)
T Portabile
Linguaggi dinamici – A.A. 2009/2010
4
5. Esecuzione
T L'esecuzione avviene attraverso l'interprete
perl,
perl presente in forma pacchettizzata in tutte
le distribuzioni di software moderne
T GNU/Linux (Debian): sudo apt-get install perl
T Windows: ActivePerl
T Si esegue un programma passandolo come
d l
argomento all'interprete:
T perl filename
T perl -e ' statement '
Linguaggi dinamici – A.A. 2009/2010
5
6. Documentazione
T Il Perl fornisce il proprio strumento di
documentazione,
documentazione analogo alle man page
T Comando perldoc
T Debian: sudo apt-get install perl-doc
D bi d t t i t ll ld
T perldoc perltoc
T Usi comuni:
T p
perldoc argomento: invoca la man page di
g p g
argomento (deve essere un nome esatto)
T perldoc -q parola chiave: ricerca la parola
q parola_chiave:
chiave nelle FAQ
T perldoc -f funzione: invoca la man page della
f
funzione builtin
Linguaggi dinamici – A.A. 2009/2010
6
7. Blocchi di codice, statement, commenti
T Il singolo statement è concluso da un carattere
punto e virgola ;
T print( “Hello worldn” );
T Il bl
blocco di codice è delimitato da parentesi
di d li it t d t i
graffe {}
T { print ( “Hello worldn” ); }
T Forte analogia con il linguaggio C
T Il carattere # rappresenta l'inizio di un
commento
Linguaggi dinamici – A.A. 2009/2010
7
8. Scheletro di un programma Perl
#!/usr/bin/perl
<direttive pragma>
<direttive di importazione moduli esterni>
<blocco BEGIN>
blocco BEGIN
<Sequenza di statement>
<blocco END>
Linguaggi dinamici – A.A. 2009/2010
8
9. Direttive pragma
T Una direttiva pragma è uno statement che
importa uno dei moduli speciali del Perl
T Tali moduli non arricchiscono le funzionalità
offerte dal linguaggio bensì forniscono al
linguaggio,
compilatore/interprete informazioni sul
programma stesso
T Il formato di una direttiva pragma è il seguente:
use modulo_speciale;
T
T “use” è una funzione builtin che importa le
funzionalità di un modulo
Linguaggi dinamici – A.A. 2009/2010
9
10. Esempi di direttive pragma
T use warnings: l'interprete stampa messaggi di
avvertimento in caso di espressioni a rischio
T use warnings;
T Fa
F un controllo locale, ad es. non ci avverte di
t ll l l d i t
possibili problemi tra file diversi
T Per bilit
P abilitare tutti i messaggi di avvertimento,
t tti i ti t
occorre invocare l'interprete con l'opzione -w
Linguaggi dinamici – A.A. 2009/2010
10
11. Esempi di direttive pragma
T use strict: vieta usi “libertini” del codice,
producendo errori a compile o a run time
T use strict;
T perldoc strict per maggiori informazioni
ld ti t i ii f i i
T use diagnostics: strumento di debugging; in
caso di errore a compile o a run time, stampa
un messaggio di diagnostica che prova a
spiegare l'accaduto
T use diagnostics;
Linguaggi dinamici – A.A. 2009/2010
11
12. Direttive di importazione moduli
T Una direttiva di importazione moduli è uno
statement che importa uno dei moduli del Perl
T Tali moduli arricchiscono le funzionalità
esterne offerte
T GUI, database, rete, processi, thread, file
T Il formato di una direttiva di importazione è il
seguente:
Tuse Path::To::NameSpace::Module;
T Il modulo è identificato dal suo nome completo
p
(inclusivo di namespace)
Linguaggi dinamici – A.A. 2009/2010
12
13. Blocchi BEGIN{}, END{}
T In un programma possono essere specificati
due blocchi di codice particolari, aventi nome
particolari
BEGIN ed END rispettivamente
T Sintassi mutuata dal linguaggio AWK
T BEGIN: compilato ed interpretato non appena il
parser lo identifica
T Controllo di esistenza moduli a livello di
compilazione
il i
T Allocazione di risorse
T END: interpretato all'uscita del programma
T Rilascio di risorse
Linguaggi dinamici – A.A. 2009/2010
13
14. Variabili
T Il Perl definisce alcune categorie di variabili
T Scalari: contenitori semplici di una sola
informazione (variabili semplici)
T Array: oggetti che possono contenere più di
A tti h t iù
una informazione
T Hash: tabella
H h t b ll associativa chiave => valore
i ti hi > l
T Reference: variabili che contengono un'altra
variabile (puntatori opachi)
i bil ( t t i hi)
T Assegnamento di variabili: operatore =
Linguaggi dinamici – A.A. 2009/2010
14
15. Variabili scalari
T La variabile scalare (o, più semplicemente, uno
scalare) rappresenta il tipo di dato più
semplice in Perl
T Può contenere un solo valore (da cui il nome
nome,
mutato dalla Fisica)
T Il valore può essere di un tipo qualunque, senza
qualunque
dichiarazione esplicita (dynamic typing)
T Intero
T Floating point
T St i
Stringa
Linguaggi dinamici – A.A. 2009/2010
15
16. Nomi delle variabili scalari
T Tutte le variabili scalari cominciano con il
simbolo $
T Segue il nome vero e proprio, una
combinazione arbitrariamente lunga di lettere,
lettere
digit ed underscore (_)
T Esempi di nomi di variabile leciti:
E i i i bil l iti
T $foo
T $foo_blah
T $
$x100y200z
y
T $HiDave
T $Very_Descriptive_Name
$Very Descriptive Name
Linguaggi dinamici – A.A. 2009/2010
16
17. Assegnamento scalare
T Si utilizza l'operatore =
$pi = 3.141593;
3 141593;
$foo = “foo”; Ricordatevi i punti e virgola
$Foo = 27; al termine di ciascuno
statement!
Linguaggi dinamici – A.A. 2009/2010
17
18. Costanti scalari
T Le costanti scalari
sono definite allo
stesso modo del C
3
3.14159265
6.02E23
“foo” Non iniziate le costanti
032 numeriche con un 0. Il Perl lo
interpreta come una
0x1a codifica ottale!
Linguaggi dinamici – A.A. 2009/2010
18
19. Stringhe scalari (literals)
T Le variabili scalari contenenti una stringa
devono essere racchiuse fra singole quote ( ')
(' )
oppure fra doppie quote (“ ”)
T Singole quote:
T La stringa viene considerata così com'è, senza
alcun intervento dell'interprete
dell interprete
T Doppie quote:
T L'interprete interviene nella costruzione della
stringa
T È possibile utilizzare alcune sequenze speciali
T È possibile inserire risultati di espressioni
p p
Linguaggi dinamici – A.A. 2009/2010
19
20. Quote doppie e backslash
T All'interno di una stringa con quote doppie, il
carattere backslash () introduce le sequenze
speciali
T n: newline
T r: carriage return
T t: tabulazione
t t b l i
T : un singolo carattere backslash
T ”: un singolo carattere di virgolette “
Linguaggi dinamici – A.A. 2009/2010
20
21. Esempi di stringhe
Espressione: Risultato visivo:
“Hellon” Hello Newline
'Hellon' Hellon No newline
“12t6t3” 12 6 3
'12t6t3'
12t6t3 12t6t3
“He said ”Hi”” He said ”Hi”
'He said ”Hi”’ He said ”Hi”
'He said ”Hi”' He said ”Hi”
Linguaggi dinamici – A.A. 2009/2010
21
22. Interpolazione di variabili
T All'interno di una stringa con quote doppie,
una variabile scalare è interpolata – essa viene
rimpiazzata dal suo valore
$num = 13;
$foo = “The number is $numn”;
print $foo;
The number is 13
Linguaggi dinamici – A.A. 2009/2010
22
23. Problemi legati all'interpolazione
T Si consideri il seguente frammento di codice
$num = 13; $number = 17;
$foo = “The number is $number”;
T Quale è il valore di $foo?
T "The number is 13ber"
T "The number is 17"
T Il Perl disambigua questo caso considerando il
nome di variabile più lungo possibile
T $foo
$f : "Th number is 17"
"The b i
Linguaggi dinamici – A.A. 2009/2010
23
24. Disabilitare l'interpolazione
T In certi casi, l'interpolazione deve essere
disabilitata
T Stampa stringhe contenenti il nome di una
variabile ( The number in $num is 13”)
(“The 13 )
T Si usa il backslash come operatore di escape
T Il backslash, posto di fronte ad un carattere
b k l h f d
speciale, ne annulla il significato speciale e lo
rende un semplice carattere
T $foo = "The number in $num is $num";
Linguaggi dinamici – A.A. 2009/2010
24
25. Operatori stringa
T Il Perl mette a disposizione l'operatore di
concatenazione di stringhe ( )(.)
T Esempi
$myname = "D
$ "Dave" . " " . "H lli
" "Hollinger";
"
$myname = $first . $blank . $last;
Linguaggi dinamici – A.A. 2009/2010
25
26. Operatori stringa
T Il Perl mette a disposizione l'operatore di
ripetizione di stringhe (x)
Espressione: Valore:
“M” x 4
M “MMMM”
MMMM
“Hello” x 2 “HelloHello”
“Joe” x (5 - 2) “JoeJoeJoe”
Linguaggi dinamici – A.A. 2009/2010
26
27. Operatori di confronto
T Il Perl mette a disposizione operatori di
confronto per i numeri e per le stringhe
T Attenzione: non essendo il tipo di dato di uno
scalare dichiarato esplicitamente l'interprete
esplicitamente, l interprete
non è in grado di segnalare a tempo di
compilazione se è usato l'operatore giusto
l operatore
T Se si intende usare uno scalare in un dato
modo (numero o stringa), bisogna invocare
d ( ti ) bi i
esplicitamente l'operatore di confronto adatto
T Valori diversi da 0 sono considerati TRUE; il
valore 0 è considerato FALSE
Linguaggi dinamici – A.A. 2009/2010
27
28. Operatori di confronto
Confronto Operatore Operatore
Numerico Stringa
Uguale == eq
Minore di < lt
Maggiore di > gt
Minore o uguale di
g ale <=
< le
Maggiore o uguale di >= ge
Linguaggi dinamici – A.A. 2009/2010
28
29. Confronto fra stringhe
T Il confronto fra stringhe è quello classico
lessicografico
T Si estrae il primo carattere delle stringa
T Si calcolano i relativi codici ASCII
l l l ti i di i
T Si confrontano tali codici numerici
T Al numero più basso corrisponde la stringa
minore
T Se i caratteri sono uguali, si procede con il
secondo carattere, e così via
Linguaggi dinamici – A.A. 2009/2010
29
30. Conversione dei dati
T A seconda del contesto utilizzato, l'interprete
converte scalari in tipi di dato numero o
stringa
T 2 * “3 14” provoca una conversione di “3 14” in
3.14 3.14
numero float, poiché * è definito solo sui tipi di
dato numerici
T (117 lt 23) converte i numeri 117 e 23 in
stringhe,
stringhe poiché l'operatore lt è definito solo sui
l operatore
tipi di dato stringa
T $x == “POST” converte entrambe le variabili ad
POST
un numero, poiché l'operatore == è definito solo
sui tipi di dato numero
Linguaggi dinamici – A.A. 2009/2010
30
31. Conversione stringa : numero
T È sufficiente che una stringa inizi con una
rappresentazione valida di un numero perché
una conversione stringa : intero possa aver
luogo
uogo
T In un contesto numerico:
T “13.5Joe”
“13 5Joe” viene convertito in 13.5
13 5
T “Hello” viene convertito in 0
T “Joe13.5” viene convertito in 0
Linguaggi dinamici – A.A. 2009/2010
31
32. Operatori booleani
T Gli operatori booleani hanno la stessa sintassi
del linguaggio C
T Operatore or logico ||:
T Se
S il primo operando è diverso da 0, ritorna 1
i d di d 0 it
T Altrimenti, ritorna 1 se il secondo operando è
diverso da 0 e 0 se è uguale a 0
di d l
T Operatore and logico &&:
T Se il primo operando è uguale a 0, ritorna 0
T Altrimenti, ritorna 1 se il secondo operando è
diverso da 0 e 0 se è uguale a 0
Linguaggi dinamici – A.A. 2009/2010
32
33. Operatori booleani
T Gli operatori booleani hanno la stessa sintassi
del linguaggio C
T Operatore or bit a bit |:
T Ritorna il risultato d ll' bit a bit
Rit i lt t dell'or
T 1|4=5
T Operatore and bit a bit &:
T Ritorna il risultato dell'and bit a bit
T 1&3=1
T Per ulteriori chiarimenti si consulti il manuale
chiarimenti,
degli operatori del Perl: perldoc perlop
Linguaggi dinamici – A.A. 2009/2010
33
34. Operatori booleani
T Gli operatori booleani hanno la stessa sintassi
del linguaggio C
T Operatore di negazione logica !:
T Ritorna il risultato d ll negazione logica
Rit i lt t della i l i
T 0 diventa 1
T 1 diventa 0
T q
qualunque altro valore porta ad un risultato
q p
indefinito
Linguaggi dinamici – A.A. 2009/2010
34
35. Array
T La variabile array (o, più semplicemente, un
array) rappresenta l'astrazione di una lista
l astrazione
T Può contenere più di un valore
T Il valore può essere di un tipo qualunque
l ò ti l
scalare, senza dichiarazione esplicita (dynamic
typing)
T Intero
T Fl
Floating point
ti i t
T Stringa
T Reference
T Un array non può contenere un altro array; ma
può contenere un puntatore ad un altro array
Linguaggi dinamici – A.A. 2009/2010
35
36. Nomi delle variabili array
T Tutte le variabili array cominciano con il
simbolo @
T Segue il nome vero e proprio, una
combinazione arbitrariamente lunga di lettere,
lettere
digit ed underscore (_)
T Esempi di nomi di variabile leciti:
E i i i bil l iti
T @wt
T @foo_blah
T @
@x100y200z
y
T @HiDave
T @Very_Descriptive_Name
@Very Descriptive Name
Linguaggi dinamici – A.A. 2009/2010
36
37. Assegnazione array
T Si utilizza l'operatore =
@wt = (1, 2 3 4);
(1 2, 3,
@wt = (1, “ciao”, 2);
T Attenzione: l'assegnazione di un array
all'interno di un array è idempotente
T @wt = (1, (2, 3), 4); ha lo stesso significato di
@
@wt = ( , 2, 3, 4);
(1, , , );
Linguaggi dinamici – A.A. 2009/2010
37
38. Accesso elementi di un array
T Ciascun elemento di un array è una variabile
scalare
T Pertanto, un elemento di un array è
identificato dal simbolo $ e non da @ (!)
$,
T Per il resto, la sintassi è simile al C
T Gli indici di un array partono da 0
@
@wt = ( , 2, 3, 4);
(1, , , );
print $wt[2]; Stampa 3
T Si possono usare indici negativi; -1 è l'ultimo
elemento, -2 il penultimo, e così via
l t 2 lti ì i
Linguaggi dinamici – A.A. 2009/2010
38
39. Array multidimensionali
T Gli array multidimensionali sono dichiarati e
gestiti come nel linguaggio C
T Per specificare molteplici dimensioni, si
usano altrettanti indici fra parentesi quadreIl
gestore della memoria dell'interprete alloca
T $x[7][4][3] 12;
$ [7][4][3] = 12
Linguaggi dinamici – A.A. 2009/2010
39
40. Lista
T Una lista è un contenitore di elementi fra
parentesi tonde
T (1, 2, 3, 4) negli esempi precedenti
T @x (1, 2 3, 4);
@ = (1 2, 3 4) assegna l lista (1, 2, 3, 4) alla
la li t (1 2 3 ll
variabile di tipo array x
T L'uso più ovvio delle liste è nei cicli:
L' iù i d ll li t i i li
for $i ( (1, 2, 4) ) {
print $i . “n”;
}
Linguaggi dinamici – A.A. 2009/2010
40
41. Array e code
T L'array può essere gestito come una coda
T Funzione builtin shift:
T shift @array: rimuove e ritorna il primo valore
dell'array @array
T Funzione builtin unshift:
T unshift @array, @list: inserisce la lista @list in
cima alla variabile di tipo array @array, e ritorna il
numero di elementi nell'array in caso di successo
T unshift @array, $scalar: inserisce lo scalare
$scalar in cima alla variabile di tipo array @array, e
@array
ritorna il numero di elementi nell'array in caso di
successo
Linguaggi dinamici – A.A. 2009/2010
41
42. Array e stack
T L'array può essere gestito come uno stack
T Funzione builtin push:
T push @array, @list: inserisce la lista @list in coda
all'array @array e ritorna il numero di elementi
@array,
nell'array in caso di successo
T push @array, $scalar: inserisce lo scalare $scalar
@array
in coda all'array @array, e ritorna il numero di
elementi nell'array in caso di successo
y
T Funzione builtin pop:
T pop @array: rimuove e ritorna l ultimo
l'ultimo
elemento di @array
Linguaggi dinamici – A.A. 2009/2010
42
43. Contesto scalare e lista
T Una lista può essere valutata in due contesti
diversi
T Scalare: l'operazione che coinvolge la lista
produce come risultato uno scalare
T Lista: l'operazione che coinvolge la lista
produce come risultato una lista o un array
T Se si usa (inavvertitamente) una lista in un
contesto scalare, il Perl non dà un messaggio
t t l P l i
di errore!
T L'array viene trasformato in uno scalare con
una operazione opportuna!
T Il numero di elementi dell'array
Linguaggi dinamici – A.A. 2009/2010
43
44. Contesti e polimorfismo
T L'uso di diversi contesti (scalare, lista)
permette di implementare una forma
rudimentale di polimorfismo
T Si può richiedere che una espressione ritorni
un risultato scalare (funzione builtin scalar())
T All'interno di una funzione, si può verificare
All'i t f i i ò ifi
se il risultato richiesto è un array oppure no
(funzione b ilti wantarray())
(f i builtin t ())
Linguaggi dinamici – A.A. 2009/2010
44
45. Slicing degli array
T Il Perl permette la gestione diretta di porzioni
di array (slicing)
T Operatore di range ..: permette di specificare
un intervallo contiguo di indici di un array
T Operatore di selezione ,: permette di
specificare un i di b preciso di un array
ifi indice ben i
T L'array su cui si effettua lo slicing è
referenziato con il simbolo @, dal momento
che il risultato delle operazioni è un array
@array_slice = @array_di_partenza[a..b];
@array_slice @array_di_partenza[a, b, c,
@array slice = @array di partenza[a b c d];
Linguaggi dinamici – A.A. 2009/2010
45
46. Hash
T La variabile hash (o, più semplicemente, un
hash) rappresenta l astrazione di una lista
l'astrazione
associativa
T Può contenere più di un valore
T Il valore può essere di un tipo qualunque
scalare,
scalare senza dichiarazione esplicita (dynamic
typing)
T Intero
T Floating point
T St i
Stringa
T Reference
Linguaggi dinamici – A.A. 2009/2010
46
47. Nomi delle variabili hash
T Tutte le variabili hash cominciano con il
simbolo %
T Segue il nome vero e proprio, una
combinazione arbitrariamente lunga di lettere,
lettere
digit ed underscore (_)
T Esempi di nomi di variabile leciti:
E i i i bil l iti
T %wt
T %foo_blah
T %x100y200z
y
T %HiDave
T %Very_Descriptive_Name
%Very Descriptive Name
Linguaggi dinamici – A.A. 2009/2010
47
48. Assegnamento hash
T Si utilizza l'operatore = per l'assegnamento
dell hash
dell'hash ad una variabile
T Si utilizza l'operatore => per associare
stringhe letterali (dette chiavi) ai corrispettivi
valori
%wt
% t = ( abc => 12, d f => “S Francisco” );
b 12 defg “San F i ”)
T Il contenuto della hash è una lista di elementi,
che può quindi essere scritta come un array
T In quest'ultimo caso, le chiavi devono essere
q ,
racchiuse fra quote
%wt = ( “abc”, 12 “defg”, “San Francisco );
abc 12, defg San Francisco”
Linguaggi dinamici – A.A. 2009/2010
48
49. Accesso elementi di un hash
T Ciascun elemento di un hash è una variabile
scalare
T Pertanto, un elemento di una hash è
identificato dal simbolo $ e non da % (!)
$,
T A differenza degli array, qui la chiave è
racchiusa fra parentesi graffe
hi f t i ff
print $wt{abc} ; Stampa 12
Linguaggi dinamici – A.A. 2009/2010
49
50. Esistenza chiavi hash
T Si utilizza la funzione builtin exists per
controllare se una chiave esiste in un hash
T exists $wt{abc};
T Vuole i i
V l in ingresso il contenuto puntato da una
t t t t d
chiave di un hash
T Ritorna 1 se l chiave esiste (anche se con un
Rit la hi i t ( h
valore undef)
T Ritorna 0 altrimenti
Rit lt i ti
T exists() funziona anche con gli array
Linguaggi dinamici – A.A. 2009/2010
50
51. Definizione chiavi hash
T Si utilizza la funzione builtin defined per
controllare se una chiave esiste ed è definita
in un hash
T defined $wt{abc};
T Vuole in ingresso il contenuto puntato da una
chiave di un hash
T Ritorna 1 se la chiave esiste ed ha un valore
definito
T Ritorna 0 altrimenti
T defined() funziona anche con gli array
Linguaggi dinamici – A.A. 2009/2010
51
52. Distruzione chiavi hash
T Si utilizza la funzione builtin delete per
distruggere una chiave ed il suo contenuto
delete $wt{abc};
T d l t () funziona anche con gli array
delete() f i h li
T Se si cancella l'ultimo elemento dell'array,
l'operazione è equivalente ad una pop
T Se si cancella un elemento interno, esso non
,
viene rimosso, ma viene sostituito con undef
T Non appena si prova ad accederlo, il
comportamento del programma diventa
indefinito
Linguaggi dinamici – A.A. 2009/2010
52
53. Accesso a chiavi e valori
T Sono messi a disposizione due metodi molto
comodi per gestire in blocco l intero insieme
l'intero
delle chiavi e dei valori di un hash
T keys (%hash):
T Ritorna un array contenente le chiavi dell'hash
T L'ordine non è definito a priori (non ci fate
' di d fi i i i( if
affidamento)
T values (%hash):
T Ritorna un array contenente i valori dell'hash
T L'ordine non è definito a priori (non ci fate
affidamento))
Linguaggi dinamici – A.A. 2009/2010
53
54. Slicing degli hash
T Il Perl permette la gestione diretta di porzioni
di hash (slicing)
T L'operazione di range non avrebbe senso
T O
Operatore di selezione , permette di
t l i tt
specificare un indice ben preciso di un hash
T L'hash su cui si effettua lo slicing è
referenziato con il simbolo @, poiché si sta
operando con un array di indici
@
@values = @hash{$key1, $ y , $ y , $ y };
@ {$ y , $key2, $key3, $key4};
Linguaggi dinamici – A.A. 2009/2010
54
55. Reference
T La variabile reference (o, più semplicemente,
una reference) è un particolare tipo di
variabile scalare il cui contenuto è l'indirizzo
d u a t a a ab e
di un'altra variabile
T Analogo dei puntatori nel linguaggio C
T Può puntare ad un tipo qualunque, senza
qualunque
dichiarazione esplicita (dynamic typing)
T Intero
T Floating point
T St i
Stringa
T Reference
T Array, Hash
Linguaggi dinamici – A.A. 2009/2010
55
56. Nomi delle variabili reference
T Tutte le variabili reference, in quanto scalari,
cominciano con il simbolo $
T Segue il nome vero e proprio, una
combinazione arbitrariamente lunga di lettere,
lettere
digit ed underscore (_)
T Esempi di nomi di variabile leciti:
E i i i bil l iti
T $wt
T $foo_blah
T $
$x100y200z
y
T $HiDave
T $Very_Descriptive_Name
$Very Descriptive Name
Linguaggi dinamici – A.A. 2009/2010
56
57. Assegnamento reference
T Si utilizza l'operatore = per l'assegnamento
dell hash
dell'hash ad una variabile
T Si utilizza l'operatore per calcolare l'indirizzo
di memoria di una variabile
@x = (1, 2, 3, 4);
$rx = @x;
Linguaggi dinamici – A.A. 2009/2010
57
58. Dereferenziazione reference
T Data una reference, si utilizza il seguente
costrutto per ottenere il contenuto
dell'indirizzo
T Si individua il simbolo associato al tipo di
variabile ($ per uno scalare, @ per un array, %
per un hash)
T Si aprono e chiudono le parentesi graffe {}
T Si scrive l'espressione reference fra le
l espressione
parentesi graffe
@x (1, 2, 3, 4); $rx @x;
@ = (1 2 3 4) $ = @
@orig_copy_x = @{ $rx };
Linguaggi dinamici – A.A. 2009/2010
58
59. Dereferenziazione reference
T Il costrutto può essere semplificato togliendo
le parentesi graffe
@x = (1, 2, 3, 4); $rx = @x;
$orig_copy_x = @$
$ i @$rx;
T La semplificazione vale solo nel caso in cui
l'espressione fra parentesi graffe sia scalare!
Linguaggi dinamici – A.A. 2009/2010
59
60. Variabili anonime
T Le variabili anonime sono delle variabili a cui
non è direttamente associato un nome
Esse vengono dichiarate non direttamente,
T
come avviene normalmente
T Si genera un contenuto di una variabile
T L
Lo si fa puntare da una reference
if t d f
T Meccanismo analogo (concettualmente) alla
malloc() d l C
ll () del
Linguaggi dinamici – A.A. 2009/2010
60
61. Dichiarazione variabili anonime
T Array:
T La lista anonima associata alla variabile
puntatrice si indica con le parentesi quadre
T $x [5, 12 13];
$ = [5 12, 13]
T Hash:
T La lista anonima associata alla variabile
puntatrice si indica con le parentesi graffe
T $x = { name => “nome”, age => 30};
T È stata creata una struttura dati puntata dalla
variabile $x; la lista non è direttamente
assoc ata
associata ad u nome d variabile ( suo
un o e di a ab e (il
indirizzo lo è!)
Linguaggi dinamici – A.A. 2009/2010
61
62. Dereferenziazione variabili anonime
T Si usa l'operatore -> per ottenere il contenuto
puntato dalla variabile
$x = [5, 12, 13];
$y {name => "
$ ={ "penelope", age => 105}
l " 105};
print $x->[1] . “n”;
print $y->{age}, "n";
Linguaggi dinamici – A.A. 2009/2010
62
63. Scope
T È possibile definire due tipi diversi di scope
per le variabili
T Scope statico:
T Dichiarazione di variabile preceduta dalla parola
Di hi i i bil d t d ll l
chiave my
T my nome_var = valore;
l
T Scope dinamico:
T Dichiarazione di variabile preceduta dalla parola
chiave local
T local nome_var = valore;
Linguaggi dinamici – A.A. 2009/2010
63
64. Scope
T È possibile anche non dichiarare
esplicitamente lo scope di una variabile,
variabile
omettendo le parole chiavi my e local
T $x = 3;
T In tal caso, la variabile è dichiarata
globalmente
T È visibile in moduli diversi!
T L'uso della dichiarazione my è fortemente
consigliato (incapsulamento)
Linguaggi dinamici – A.A. 2009/2010
64
65. Costrutti condizionali
T Costrutto if-then-else: simile al linguaggio C
if (condizione) {
statement;
} elsif (condizione) {
statement;
} else {
statement;
}
T Occorre sempre mettere le parentesi graffe
(anche quando si ha un solo statement)
T else if di
l diventa elsif
t l if
Linguaggi dinamici – A.A. 2009/2010
65
66. Costrutti condizionali
T Costrutto unless: duale dell'if-then-else
unless (condizione) {
statement;
}
T Viene eseguito lo statement finché la
condizione NON si verifica
T Perfettamente equivalente a:
If (! condizione) {
statement;
}
Linguaggi dinamici – A.A. 2009/2010
66
67. Etichette
T Il perl supporta le etichette, ossia sequenze di
caratteri alfanumerici che possono essere
raggiunte tramite comandi di salto
T Una etichetta è solitamente descritta da una
stringa di caratteri in maiuscolo, terminata dal
carattere speciale :
LABEL:
statement;
…
T Le etichette sono usate per “bollare” i blocchi
di codice relativi ai costrutti iterativi
Linguaggi dinamici – A.A. 2009/2010
67
68. Comandi di salto
T Comando goto: permette di saltare ad una
specifica etichetta
goto LABEL;
T C
Comando next:
d t
T Salta alla prossima iterazione di un ciclo
T Se accompagnato da una label, salta
direttamente alla label
Linguaggi dinamici – A.A. 2009/2010
68
69. Comandi di salto
T Comando last:
T Finisce un ciclo
T Se accompagnato da una label, salta alla
label per l'ultima volta
T Comando redo:
T Ripete l'iterazione corrente del ciclo
T Se accompagnato da una label, ripete
label
l'iterazione associata alla stessa
Linguaggi dinamici – A.A. 2009/2010
69
70. Comandi di salto
T Attenzione!
T I comandi di salto (soprattutto il goto)
potrebbero rendere meno chiaro il flusso di
esecuzione del programma
T E non sono essenziali per l’espressività
T Altri
Alt i costrutti possono essere usati al loro
t tti ti l l
posto
T Ma a volte sono comodi!
Linguaggi dinamici – A.A. 2009/2010
70
71. Costrutti iterativi
T Costrutto while: identico al linguaggio C
while (condizione) {
statement;
}
T Costrutto do-until: analogo del costrutto do-
while nel linguaggio C
do {
statement;
} until (condizione);
Linguaggi dinamici – A.A. 2009/2010
71
72. Costrutti iterativi
T Costrutto for: simile al linguaggio C
LABEL:
for (espr1; espr2; espr3) {
statement;
}
T espr1 definisce il valore iniziale dell'indice
nell'iterazione, espr2 definisce la condizione di
, p
stop, espr3 definisce la modalità di incremento
dell'indice
T Ne esiste anche una versione che sfrutta una
lista (tipo foreach)
Linguaggi dinamici – A.A. 2009/2010
72
73. Costrutti iterativi
T Costrutto foreach:
LABEL:
foreach $var (lista) {
statement;
}
T Qui, $var assume tutti i valori di una lista
foreach $count(5 4 3 2 1 “Via”) {
$count(5, 4, 3, 2, 1, Via )
print $count . “n”;
}
T Il costrutto foreach è molto più efficiente del
for, perché non deve valutare le espressioni
Linguaggi dinamici – A.A. 2009/2010
73