Per il corso di "Automi, Linguaggi e Complessità", le slide sulle Espressioni Regolari: definizioni, la loro implementazione tramite Automi Finiti, i metacaretteri di PCRE, ecc...
co-authors: Scola Davide and Maia Nicoletta
Small workshop on Inferno, Limbo and the Dis virtual machine.
Inferno is a new operative system developped for creation and support of network systems and distribuited services.
There are three fundamental programming principles: all resources are files in a hierarchic file system, the network is a unic namespace like a file system hierarchic, it uses Styx that is a standard protocol of comunication for local and remote resources.
Limbo is the programming language for the Inferno OS.
The language is Object Based, you can compile it or interpret it with the Dis virtual machine (like Java virtual machine with a JIT compiler).
Limbo has a native support for: array, string, int, float, tuple (like record), channel (linda-like), and other...
The Limbo's channels are used to comunicate with other processes or with thread.
The Dis virtual machine is an environment for Limbo programs and it has important features: CISC architecture, memory-to-memory, many high level types, just in time compiler, ecc...
In the end of presentation there is a comparison between Dis, Java VM and C# .Net VM.
Per il corso di "Automi, Linguaggi e Complessità", le slide sulle Espressioni Regolari: definizioni, la loro implementazione tramite Automi Finiti, i metacaretteri di PCRE, ecc...
co-authors: Scola Davide and Maia Nicoletta
Small workshop on Inferno, Limbo and the Dis virtual machine.
Inferno is a new operative system developped for creation and support of network systems and distribuited services.
There are three fundamental programming principles: all resources are files in a hierarchic file system, the network is a unic namespace like a file system hierarchic, it uses Styx that is a standard protocol of comunication for local and remote resources.
Limbo is the programming language for the Inferno OS.
The language is Object Based, you can compile it or interpret it with the Dis virtual machine (like Java virtual machine with a JIT compiler).
Limbo has a native support for: array, string, int, float, tuple (like record), channel (linda-like), and other...
The Limbo's channels are used to comunicate with other processes or with thread.
The Dis virtual machine is an environment for Limbo programs and it has important features: CISC architecture, memory-to-memory, many high level types, just in time compiler, ecc...
In the end of presentation there is a comparison between Dis, Java VM and C# .Net VM.
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