Post on 19-Jun-2015
LINGUAGGI DINAMICILINGUAGGI DINAMICIPARTE 2
IL LINGUAGGIO PERLIL LINGUAGGIO PERL
Linguaggi dinamici – A.A. 2009/20101
Parte 2
Introduzione al Perl
Linguaggi dinamici – A.A. 2009/20102
Un po’ di storia
� PERL: acronimo di Practical Extraction Report LanguageLanguage
� Nasce nel 1986, come un insieme di strumenti per la gestione della configurazione di unper la gestione della configurazione di un server USENET
A t L W ll� Autore: Larry Wall
� 1987: V1.0
� 1999: V5.003 (milestone release)
� 2008: V5 10� 2008: V5.10
� Perl6 (radicalmente diverso da V5.10) è in fase di standardizzazione
Linguaggi dinamici – A.A. 2009/20103
di standardizzazione
Caratteristiche
� Sintassi estremamente ricca e variegataMotto del Perl: “There is more than one way to� Motto del Perl: “There is more than one way to do it” (TIMTOWTDI)
S t ll t l i l i di� Supporto eccellente per la manipolazione di testi (espressioni regolari del Perl)
� Include diversi comandi di shell come builtin
� Molto liberale nei costrutti e nella tipizzazionep
� Archivio di moduli sconfinato (CPAN)
Portabile� Portabile
Linguaggi dinamici – A.A. 2009/20104
Esecuzione
� L'esecuzione avviene attraverso l'interprete perl presente in forma pacchettizzata in tutteperl, presente in forma pacchettizzata in tutte le distribuzioni di software moderne� GNU/Linux (Debian): sudo apt-get install perl� GNU/Linux (Debian): sudo apt-get install perl
� Windows: ActivePerl
Si d l� Si esegue un programma passandolo come argomento all'interprete:� perl filename
� perl -e ' statement '
Linguaggi dinamici – A.A. 2009/20105
Documentazione
� Il Perl fornisce il proprio strumento di documentazione analogo alle man pagedocumentazione, analogo alle man page
� Comando perldocD bi d t t i t ll l d� Debian: sudo apt-get install perl-doc
� perldoc perltoc
� Usi comuni:� perldoc argomento: invoca la man page di p g p g
argomento (deve essere un nome esatto)
� perldoc -q parola chiave: ricerca la parolaperldoc q parola_chiave: ricerca la parola chiave nelle FAQ
� perldoc -f funzione: invoca la man page della
Linguaggi dinamici – A.A. 2009/20106
� perldoc f funzione: invoca la man page della funzione builtin
Blocchi di codice, statement, commenti
� Il singolo statement è concluso da un carattere punto e virgola ;punto e virgola ;� print( “Hello world\n” );
Il bl di di è d li it t d t i� Il blocco di codice è delimitato da parentesi graffe {}� { print ( “Hello world\n” ); }
� Forte analogia con il linguaggio C
� Il carattere # rappresenta l'inizio di un commentocommento
Linguaggi dinamici – A.A. 2009/20107
Scheletro di un programma Perl
#!/usr/bin/perl
<direttive pragma>
<direttive di importazione moduli esterni>
<blocco BEGIN>blocco BEGIN
<Sequenza di statement>
<blocco END><blocco END>
Linguaggi dinamici – A.A. 2009/20108
Direttive pragma
� Una direttiva pragma è uno statement che importa uno dei moduli speciali del Perlimporta uno dei moduli speciali del Perl
� Tali moduli non arricchiscono le funzionalità offerte dal linguaggio bensì forniscono alofferte dal linguaggio, bensì forniscono al compilatore/interprete informazioni sul programma stessoprogramma stesso
� Il formato di una direttiva pragma è il seguente:� use modulo_speciale;
� “use” è una funzione builtin che importa le funzionalità di un modulo
Linguaggi dinamici – A.A. 2009/20109
Esempi di direttive pragma
� use warnings: l'interprete stampa messaggi di avvertimento in caso di espressioni a rischioavvertimento in caso di espressioni a rischio� use warnings;
F t ll l l d i t di� Fa un controllo locale, ad es. non ci avverte di possibili problemi tra file diversi
P bilit t tti i i di ti t� Per abilitare tutti i messaggi di avvertimento, occorre invocare l'interprete con l'opzione -w
Linguaggi dinamici – A.A. 2009/201010
Esempi di direttive pragma
� use strict: vieta usi “libertini” del codice, producendo errori a compile o a run timeproducendo errori a compile o a run time� use strict;
ld t i t i i i f i i� perldoc strict per maggiori informazioni
� 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� use diagnostics;
Linguaggi dinamici – A.A. 2009/201011
Direttive di importazione moduli
� Una direttiva di importazione moduli è uno statement che importa uno dei moduli del Perlstatement che importa uno dei moduli del Perl
� Tali moduli arricchiscono le funzionalità esterne offerteesterne offerte� GUI, database, rete, processi, thread, file
� Il formato di una direttiva di importazione è il seguente:� use Path::To::NameSpace::Module;
� Il modulo è identificato dal suo nome completo p(inclusivo di namespace)
Linguaggi dinamici – A.A. 2009/201012
Blocchi BEGIN{}, END{}
� In un programma possono essere specificati due blocchi di codice particolari aventi nomedue blocchi di codice particolari, aventi nome BEGIN ed END rispettivamente� Sintassi mutuata dal linguaggio AWK� Sintassi mutuata dal linguaggio AWK
� BEGIN: compilato ed interpretato non appena il parser lo identificaparser lo identifica� Controllo di esistenza moduli a livello di
il icompilazione
� Allocazione di risorse
� END: interpretato all'uscita del programma� Rilascio di risorse
Linguaggi dinamici – A.A. 2009/201013
Variabili
� Il Perl definisce alcune categorie di variabiliScalari: contenitori semplici di una sola� Scalari: contenitori semplici di una sola informazione (variabili semplici)
A tti h t iù di� Array: oggetti che possono contenere più di una informazione
H h t b ll i ti hi > l� Hash: tabella associativa chiave => valore
� Reference: variabili che contengono un'altra i bil ( t t i hi)variabile (puntatori opachi)
� Assegnamento di variabili: operatore =
Linguaggi dinamici – A.A. 2009/201014
Variabili scalari
� La variabile scalare (o, più semplicemente, uno scalare) rappresenta il tipo di dato piùscalare) rappresenta il tipo di dato più semplice in Perl� Può contenere un solo valore (da cui il nome� Può contenere un solo valore (da cui il nome,
mutato dalla Fisica)
Il valore può essere di un tipo qualunque senza� Il valore può essere di un tipo qualunque, senza dichiarazione esplicita (dynamic typing)
Intero� Intero
� Floating point
St i� Stringa
Linguaggi dinamici – A.A. 2009/201015
Nomi delle variabili scalari
� Tutte le variabili scalari cominciano con il simbolo $simbolo $
� Segue il nome vero e proprio, una combinazione arbitrariamente lunga di letterecombinazione arbitrariamente lunga di lettere, digit ed underscore (_)
E i di i di i bil l iti� Esempi di nomi di variabile leciti:� $foo
� $foo_blah
� $x100y200z$ y
� $HiDave
� $Very Descriptive Name
Linguaggi dinamici – A.A. 2009/201016
� $Very_Descriptive_Name
Assegnamento scalare
� Si utilizza l'operatore =
$pi = 3 141593;$pi = 3.141593;
$foo = “foo”; Ricordatevi i punti e virgola
$Foo = 27; al termine di ciascunostatement!
Linguaggi dinamici – A.A. 2009/201017
Costanti scalari
� Le costanti scalari sono definite allosono definite allo stesso modo del C
33
3.14159265
Non iniziate le costanti
6.02E23
“foo”numeriche con un 0. Il Perl lointerpreta come unacodifica ottale!
032
0x1a codifica ottale!0x1a
Linguaggi dinamici – A.A. 2009/201018
Stringhe scalari (literals)
� Le variabili scalari contenenti una stringa devono essere racchiuse fra singole quote (' ')devono essere racchiuse fra singole quote ( ) oppure fra doppie quote (“ ”)
Singole quote:� Singole quote:� La stringa viene considerata così com'è, senza
alcun intervento dell'interpretealcun intervento dell interprete
� Doppie quote:� L'interprete interviene nella costruzione della
stringa
� È possibile utilizzare alcune sequenze speciali
� È possibile inserire risultati di espressioni
Linguaggi dinamici – A.A. 2009/201019
p p
Quote doppie e backslash
� All'interno di una stringa con quote doppie, il carattere backslash (\) introduce le sequenzecarattere backslash (\) introduce le sequenze speciali� \n: newline� \n: newline
� \r: carriage return
\t t b l i� \t: tabulazione
� \\: un singolo carattere backslash \
� \”: un singolo carattere di virgolette “
Linguaggi dinamici – A.A. 2009/201020
Esempi di stringhe
Espressione:
“Hello\n”
Risultato visivo:
Hello Newline“Hello\n”
'Hello\n'
Hello
Hello\n
Newline
No newline
“12\t6\t3”
'12\t6\t3'
12 6 3
12\t6\t312\t6\t3
“He said \”Hi\””
'He said \”Hi\”’
12\t6\t3
He said ”Hi”
He said \”Hi\”'He said \”Hi\”’
'He said ”Hi”'
He said \”Hi\”
He said ”Hi”
Linguaggi dinamici – A.A. 2009/201021
Interpolazione di variabili
� All'interno di una stringa con quote doppie, una variabile scalare è interpolata – essa vieneuna variabile scalare è interpolata essa viene rimpiazzata dal suo valore
$num = 13;$num = 13;
$foo = “The number is $num\n”;
print $foo;
The number is 13
Linguaggi dinamici – A.A. 2009/201022
Problemi legati all'interpolazione
� Si consideri il seguente frammento di codice
$num = 13; $number = 17;$num = 13; $number = 17;
$foo = “The number is $number”;
� Quale è il valore di $foo?� "The number is 13ber"
� "The number is 17"
Il Perl disambigua questo caso considerando il� Il Perl disambigua questo caso considerando il nome di variabile più lungo possibile
$f "Th b i 17"� $foo : "The number is 17"
Linguaggi dinamici – A.A. 2009/201023
Disabilitare l'interpolazione
� In certi casi, l'interpolazione deve essere disabilitatadisabilitata� Stampa stringhe contenenti il nome di una
variabile (“The number in $num is 13”)variabile ( The number in $num is 13 )
� Si usa il backslash come operatore di escapeIl b k l h di f d� Il backslash, posto di fronte ad un carattere speciale, ne annulla il significato speciale e lo rende un semplice carattererende un semplice carattere
� $foo = "The number in \$num is $num";
Linguaggi dinamici – A.A. 2009/201024
Operatori stringa
� Il Perl mette a disposizione l'operatore di concatenazione di stringhe ( )concatenazione di stringhe (.)
� Esempi
$ "D " " " "H lli "$myname = "Dave" . " " . "Hollinger";
$myname = $first . $blank . $last;
Linguaggi dinamici – A.A. 2009/201025
Operatori stringa
� Il Perl mette a disposizione l'operatore di ripetizione di stringhe (x)ripetizione di stringhe (x)
Espressione:
“M” x 4
Valore:
“MMMM”M x 4
“Hello” x 2
MMMM
“HelloHello”
“Joe” x (5 - 2) “JoeJoeJoe”
Linguaggi dinamici – A.A. 2009/201026
Operatori di confronto
� Il Perl mette a disposizione operatori di confronto per i numeri e per le stringheconfronto per i numeri e per le stringhe
� Attenzione: non essendo il tipo di dato di uno scalare dichiarato esplicitamente l'interpretescalare dichiarato esplicitamente, l interprete non è in grado di segnalare a tempo di compilazione se è usato l'operatore giustocompilazione se è usato l operatore giusto
� Se si intende usare uno scalare in un dato d ( t i ) bi imodo (numero o stringa), bisogna invocare
esplicitamente l'operatore di confronto adatto
� Valori diversi da 0 sono considerati TRUE; il valore 0 è considerato FALSE
Linguaggi dinamici – A.A. 2009/201027
Operatori di confronto
Confronto Operatore
Numerico
Operatore
StringaNumerico Stringa
Uguale
Minore di
==
<
eq
ltMinore di
Maggiore di
Minore o g ale di
>
<
lt
gt
leMinore o uguale di
Maggiore o uguale di
<=
>=
le
ge
Linguaggi dinamici – A.A. 2009/201028
Confronto fra stringhe
� Il confronto fra stringhe è quello classico lessicograficolessicografico� Si estrae il primo carattere delle stringa
Si l l i l ti i di i ASCII� Si calcolano i relativi codici ASCII
� Si confrontano tali codici numerici
� Al numero più basso corrisponde la stringa minore
� Se i caratteri sono uguali, si procede con il secondo carattere, e così via
Linguaggi dinamici – A.A. 2009/201029
Conversione dei dati
� A seconda del contesto utilizzato, l'interprete converte scalari in tipi di dato numero oconverte scalari in tipi di dato numero o stringa� 2 * “3 14” provoca una conversione di “3 14” in� 2 3.14 provoca una conversione di 3.14 in
numero float, poiché * è definito solo sui tipi di dato numericidato numerici
� (117 lt 23) converte i numeri 117 e 23 in stringhe poiché l'operatore lt è definito solo suistringhe, poiché l operatore lt è definito solo sui tipi di dato stringa
� $x == “POST” converte entrambe le variabili ad� $x == POST converte entrambe le variabili ad un numero, poiché l'operatore == è definito solo sui tipi di dato numero
Linguaggi dinamici – A.A. 2009/201030
sui tipi di dato numero
Conversione stringa : numero
� È sufficiente che una stringa inizi con una rappresentazione valida di un numero perchérappresentazione valida di un numero perché una conversione stringa : intero possa aver luogouogo
� In un contesto numerico:“13 5Joe” viene convertito in 13 5� “13.5Joe” viene convertito in 13.5
� “Hello” viene convertito in 0
� “Joe13.5” viene convertito in 0
Linguaggi dinamici – A.A. 2009/201031
Operatori booleani
� Gli operatori booleani hanno la stessa sintassi del linguaggio Cdel linguaggio C
� Operatore or logico ||:S il i d è di d 0 it 1� Se il primo operando è diverso da 0, ritorna 1
� Altrimenti, ritorna 1 se il secondo operando è di d 0 0 è l 0diverso da 0 e 0 se è uguale a 0
� Operatore and logico &&:� Se il primo operando è uguale a 0, ritorna 0
� Altrimenti, ritorna 1 se il secondo operando èAltrimenti, ritorna 1 se il secondo operando è diverso da 0 e 0 se è uguale a 0
Linguaggi dinamici – A.A. 2009/201032
Operatori booleani
� Gli operatori booleani hanno la stessa sintassi del linguaggio Cdel linguaggio C
� Operatore or bit a bit |:Rit il i lt t d ll' bit bit� Ritorna il risultato dell'or bit a bit
� 1 | 4 = 5
� Operatore and bit a bit &:� Ritorna il risultato dell'and bit a bit
� 1 & 3 = 1
Per ulteriori chiarimenti si consulti il manuale� Per ulteriori chiarimenti, si consulti il manuale degli operatori del Perl: perldoc perlop
Linguaggi dinamici – A.A. 2009/201033
Operatori booleani
� Gli operatori booleani hanno la stessa sintassi del linguaggio Cdel linguaggio C
� Operatore di negazione logica !:Rit il i lt t d ll i l i� Ritorna il risultato della negazione logica
� 0 diventa 1
� 1 diventa 0
� qualunque altro valore porta ad un risultato q q pindefinito
Linguaggi dinamici – A.A. 2009/201034
Array
� La variabile array (o, più semplicemente, un array) rappresenta l'astrazione di una listaarray) rappresenta l astrazione di una lista� Può contenere più di un valore
Il l ò di ti l� Il valore può essere di un tipo qualunque scalare, senza dichiarazione esplicita (dynamictyping)typing)
� Intero
Fl ti i t� Floating point
� Stringa
� Reference
� Un array non può contenere un altro array; ma
Linguaggi dinamici – A.A. 2009/201035
può contenere un puntatore ad un altro array
Nomi delle variabili array
� Tutte le variabili array cominciano con il simbolo @simbolo @
� Segue il nome vero e proprio, una combinazione arbitrariamente lunga di letterecombinazione arbitrariamente lunga di lettere, digit ed underscore (_)
E i di i di i bil l iti� Esempi di nomi di variabile leciti:� @wt
� @foo_blah
� @x100y200z@ y
� @HiDave
� @Very Descriptive Name
Linguaggi dinamici – A.A. 2009/201036
� @Very_Descriptive_Name
Assegnazione array
� Si utilizza l'operatore =
@wt = (1 2 3 4);@wt = (1, 2, 3, 4);
@wt = (1, “ciao”, 2);
� Attenzione: l'assegnazione di un array all'interno di un array è idempotente� @wt = (1, (2, 3), 4); ha lo stesso significato di
@wt = (1, 2, 3, 4);@ ( , , , );
Linguaggi dinamici – A.A. 2009/201037
Accesso elementi di un array
� Ciascun elemento di un array è una variabile scalarescalare
� Pertanto, un elemento di un array è identificato dal simbolo $ e non da @ (!)identificato dal simbolo $, e non da @ (!)
� Per il resto, la sintassi è simile al C� Gli indici di un array partono da 0
@wt = (1, 2, 3, 4);@ ( , , , );
print $wt[2]; Stampa 3
� Si possono usare indici negativi; -1 è l'ultimo l t 2 il lti ì i
Linguaggi dinamici – A.A. 2009/201038
elemento, -2 il penultimo, e così via
Array multidimensionali
� Gli array multidimensionali sono dichiarati e gestiti come nel linguaggio Cgestiti come nel linguaggio C
� Per specificare molteplici dimensioni, si usano altrettanti indici fra parentesi quadreIlusano altrettanti indici fra parentesi quadreIl gestore della memoria dell'interprete alloca$ [7][4][3] 12� $x[7][4][3] = 12;
Linguaggi dinamici – A.A. 2009/201039
Lista
� Una lista è un contenitore di elementi fra parentesi tondeparentesi tonde� (1, 2, 3, 4) negli esempi precedenti
@ (1 2 3 4) l li t (1 2 3 4) ll� @x = (1, 2, 3, 4); assegna la lista (1, 2, 3, 4) alla variabile di tipo array x
L' iù i d ll li t è i i li� L'uso più ovvio delle liste è nei cicli:for $i ( (1, 2, 4) ) {
print $i . “\n”;
}}
Linguaggi dinamici – A.A. 2009/201040
Array e code
� L'array può essere gestito come una coda
Funzione builtin shift:� Funzione builtin shift:� shift @array: rimuove e ritorna il primo valore
dell'array @arraydell'array @array
� Funzione builtin unshift:� 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 successonumero di elementi nell'array in caso di successo
� unshift @array, $scalar: inserisce lo scalare $scalar in cima alla variabile di tipo array @array e$scalar in cima alla variabile di tipo array @array, e ritorna il numero di elementi nell'array in caso di successo
Linguaggi dinamici – A.A. 2009/201041
Array e stack
� L'array può essere gestito come uno stack
Funzione builtin push:� Funzione builtin push:� push @array, @list: inserisce la lista @list in coda
all'array @array e ritorna il numero di elementiall'array @array, e ritorna il numero di elementi nell'array in caso di successo
push @array $scalar: inserisce lo scalare $scalar� push @array, $scalar: inserisce lo scalare $scalar in coda all'array @array, e ritorna il numero di elementi nell'array in caso di successoy
� Funzione builtin pop:pop @array: rimuove e ritorna l'ultimo� pop @array: rimuove e ritorna l ultimo elemento di @array
Linguaggi dinamici – A.A. 2009/201042
Contesto scalare e lista
� Una lista può essere valutata in due contesti diversidiversi� Scalare: l'operazione che coinvolge la lista
produce come risultato uno scalareproduce come risultato uno scalare
� Lista: l'operazione che coinvolge la lista produce come risultato una lista o un arrayproduce come risultato una lista o un array
� Se si usa (inavvertitamente) una lista in un t t l il P l dà icontesto scalare, il Perl non dà un messaggio
di errore!
� L'array viene trasformato in uno scalare con una operazione opportuna!
Linguaggi dinamici – A.A. 2009/201043
� Il numero di elementi dell'array
Contesti e polimorfismo
� L'uso di diversi contesti (scalare, lista) permette di implementare una formapermette di implementare una forma rudimentale di polimorfismo
Si può richiedere che una espressione ritorni� Si può richiedere che una espressione ritorni un risultato scalare (funzione builtin scalar())
All'i t di f i i ò ifi� All'interno di una funzione, si può verificare se il risultato richiesto è un array oppure no (f i b ilti t ())(funzione builtin wantarray())
Linguaggi dinamici – A.A. 2009/201044
Slicing degli array
� Il Perl permette la gestione diretta di porzioni di array (slicing)di array (slicing)
� Operatore di range ..: permette di specificare un intervallo contiguo di indici di un arrayun intervallo contiguo di indici di un array
� Operatore di selezione ,: permette di ifi i di b i dispecificare un indice ben preciso di un array
� 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 d];
Linguaggi dinamici – A.A. 2009/201045
@array_slice @array_di_partenza[a, b, c, d];
Hash
� La variabile hash (o, più semplicemente, un hash) rappresenta l'astrazione di una listahash) rappresenta l astrazione di una lista associativa� Può contenere più di un valore� Può contenere più di un valore
� Il valore può essere di un tipo qualunque scalare senza dichiarazione esplicita (dynamicscalare, senza dichiarazione esplicita (dynamic typing)
Intero� Intero
� Floating point
St i� Stringa
� Reference
Linguaggi dinamici – A.A. 2009/201046
Nomi delle variabili hash
� Tutte le variabili hash cominciano con il simbolo %simbolo %
� Segue il nome vero e proprio, una combinazione arbitrariamente lunga di letterecombinazione arbitrariamente lunga di lettere, digit ed underscore (_)
E i di i di i bil l iti� Esempi di nomi di variabile leciti:� %wt
� %foo_blah
� %x100y200zy
� %HiDave
� %Very Descriptive Name
Linguaggi dinamici – A.A. 2009/201047
� %Very_Descriptive_Name
Assegnamento hash
� Si utilizza l'operatore = per l'assegnamento dell'hash ad una variabiledell hash ad una variabile
� Si utilizza l'operatore => per associare stringhe letterali (dette chiavi) ai corrispettivistringhe letterali (dette chiavi) ai corrispettivi valori
% t ( b 12 d f “S F i ” )%wt = ( abc => 12, defg => “San Francisco” );
� Il contenuto della hash è una lista di elementi, che può quindi essere scritta come un array
� In quest'ultimo caso, le chiavi devono essere q ,racchiuse fra quote
%wt = ( “abc” 12 “defg” “San Francisco” );
Linguaggi dinamici – A.A. 2009/201048
%wt ( abc , 12, defg , San Francisco );
Accesso elementi di un hash
� Ciascun elemento di un hash è una variabile scalarescalare
� Pertanto, un elemento di una hash è identificato dal simbolo $ e non da % (!)identificato dal simbolo $, e non da % (!)
� A differenza degli array, qui la chiave è hi f t i ffracchiusa fra parentesi graffe
print $wt{abc} ; Stampa 12
Linguaggi dinamici – A.A. 2009/201049
Esistenza chiavi hash
� Si utilizza la funzione builtin exists per controllare se una chiave esiste in un hashcontrollare se una chiave esiste in un hash� exists $wt{abc};
V l i i il t t t t d� Vuole in ingresso il contenuto puntato da una chiave di un hash
Rit 1 l hi i t ( h� Ritorna 1 se la chiave esiste (anche se con un valore undef)
Rit 0 lt i ti� Ritorna 0 altrimenti
� exists() funziona anche con gli array
Linguaggi dinamici – A.A. 2009/201050
Definizione chiavi hash
� Si utilizza la funzione builtin defined per controllare se una chiave esiste ed è definitacontrollare se una chiave esiste ed è definita in un hash� defined $wt{abc};� defined $wt{abc};
� Vuole in ingresso il contenuto puntato da una chiave di un hashchiave di un hash
� Ritorna 1 se la chiave esiste ed ha un valore definitodefinito
� Ritorna 0 altrimenti
� defined() funziona anche con gli array
Linguaggi dinamici – A.A. 2009/201051
Distruzione chiavi hash
� Si utilizza la funzione builtin delete per distruggere una chiave ed il suo contenutodistruggere una chiave ed il suo contenuto
delete $wt{abc};
d l t () f i h li� delete() funziona anche con gli array
� Se si cancella l'ultimo elemento dell'array, l'operazione è equivalente ad una pop
� Se si cancella un elemento interno, esso non ,viene rimosso, ma viene sostituito con undef� Non appena si prova ad accederlo, il� Non appena si prova ad accederlo, il
comportamento del programma diventa indefinito
Linguaggi dinamici – A.A. 2009/201052
Accesso a chiavi e valori
� Sono messi a disposizione due metodi molto comodi per gestire in blocco l'intero insiemecomodi per gestire in blocco l intero insieme delle chiavi e dei valori di un hash
keys (%hash):� keys (%hash):� Ritorna un array contenente le chiavi dell'hash
' di è d fi i i i ( i f� L'ordine non è definito a priori (non ci fate affidamento)
� values (%hash):� Ritorna un array contenente i valori dell'hash
� L'ordine non è definito a priori (non ci fate affidamento)
Linguaggi dinamici – A.A. 2009/201053
)
Slicing degli hash
� Il Perl permette la gestione diretta di porzioni di hash (slicing)di hash (slicing)
� L'operazione di range non avrebbe senso
O t di l i tt di� Operatore di selezione , permette di specificare un indice ben preciso di un hash
� L'hash su cui si effettua lo slicing è referenziato con il simbolo @, poiché si sta operando con un array di indici
@values = @hash{$key1, $key2, $key3, $key4};@ @ {$ y , $ y , $ y , $ y };
Linguaggi dinamici – A.A. 2009/201054
Reference
� La variabile reference (o, più semplicemente, una reference) è un particolare tipo diuna reference) è un particolare tipo di variabile scalare il cui contenuto è l'indirizzo di un'altra variabiled u a t a a ab e� Analogo dei puntatori nel linguaggio C
Può puntare ad un tipo qualunque senza� Può puntare ad un tipo qualunque, senza dichiarazione esplicita (dynamic typing)
Intero� Intero
� Floating point
St i� Stringa
� Reference
Linguaggi dinamici – A.A. 2009/201055
� Array, Hash
Nomi delle variabili reference
� Tutte le variabili reference, in quanto scalari, cominciano con il simbolo $cominciano con il simbolo $
� Segue il nome vero e proprio, una combinazione arbitrariamente lunga di letterecombinazione arbitrariamente lunga di lettere, digit ed underscore (_)
E i di i di i bil l iti� Esempi di nomi di variabile leciti:� $wt
� $foo_blah
� $x100y200z$ y
� $HiDave
� $Very Descriptive Name
Linguaggi dinamici – A.A. 2009/201056
� $Very_Descriptive_Name
Assegnamento reference
� Si utilizza l'operatore = per l'assegnamento dell'hash ad una variabiledell hash ad una variabile
� Si utilizza l'operatore \ per calcolare l'indirizzo di memoria di una variabiledi memoria di una variabile
@x = (1, 2, 3, 4);
$rx = \@x;
Linguaggi dinamici – A.A. 2009/201057
Dereferenziazione reference
� Data una reference, si utilizza il seguente costrutto per ottenere il contenutocostrutto per ottenere il contenuto dell'indirizzo� Si individua il simbolo associato al tipo di� Si individua il simbolo associato al tipo di
variabile ($ per uno scalare, @ per un array, %per un hash)per un hash)
� Si aprono e chiudono le parentesi graffe {}
Si scrive l'espressione reference fra le� Si scrive l espressione reference fra le parentesi graffe
@ (1 2 3 4) $ \@@x = (1, 2, 3, 4); $rx = \@x;
@orig_copy_x = @{ $rx };
Linguaggi dinamici – A.A. 2009/201058
Dereferenziazione reference
� Il costrutto può essere semplificato togliendo le parentesi graffele parentesi graffe
@x = (1, 2, 3, 4); $rx = \@x;
$ i @$$orig_copy_x = @$rx;
� La semplificazione vale solo nel caso in cui l'espressione fra parentesi graffe sia scalare!
Linguaggi dinamici – A.A. 2009/201059
Variabili anonime
� Le variabili anonime sono delle variabili a cui non è direttamente associato un nomenon è direttamente associato un nome� Esse vengono dichiarate non direttamente,
come avviene normalmentecome avviene normalmente
� Si genera un contenuto di una variabile
L i f t d f� Lo si fa puntare da una reference
� Meccanismo analogo (concettualmente) alla ll () d l Cmalloc() del C
Linguaggi dinamici – A.A. 2009/201060
Dichiarazione variabili anonime
� Array:La lista anonima associata alla variabile� La lista anonima associata alla variabile puntatrice si indica con le parentesi quadre
$ [5 12 13]� $x = [5, 12, 13];
� Hash:� La lista anonima associata alla variabile
puntatrice si indica con le parentesi graffe
� $x = { name => “nome”, age => 30};
� È stata creata una struttura dati puntata dalla È stata creata una struttura dati puntata dalla variabile $x; la lista non è direttamente associata ad un nome di variabile (il suo
Linguaggi dinamici – A.A. 2009/201061
assoc ata ad u o e d a ab e ( suoindirizzo lo è!)
Dereferenziazione variabili anonime
� Si usa l'operatore -> per ottenere il contenuto puntato dalla variabilepuntato dalla variabile
$x = [5, 12, 13];
$ { " l " 105}$y = {name => "penelope", age => 105};
print $x->[1] . “\n”;
print $y->{age}, "\n";
Linguaggi dinamici – A.A. 2009/201062
Scope
� È possibile definire due tipi diversi di scope per le variabiliper le variabili
� Scope statico:Di hi i di i bil d t d ll l� Dichiarazione di variabile preceduta dalla parola chiave my
l� my nome_var = valore;
� Scope dinamico:� Dichiarazione di variabile preceduta dalla parola
chiave local
� local nome_var = valore;
Linguaggi dinamici – A.A. 2009/201063
Scope
� È possibile anche non dichiarare esplicitamente lo scope di una variabileesplicitamente lo scope di una variabile, omettendo le parole chiavi my e local� $x = 3;� $x = 3;
� In tal caso, la variabile è dichiarata globalmenteglobalmente� È visibile in moduli diversi!
� L'uso della dichiarazione my è fortemente consigliato (incapsulamento)
Linguaggi dinamici – A.A. 2009/201064
Costrutti condizionali
� Costrutto if-then-else: simile al linguaggio Cif (condizione) {if (condizione) {
statement;
} elsif (condizione) {
statement;
} else {
statement;statement;
}
Occorre sempre mettere le parentesi graffe� Occorre sempre mettere le parentesi graffe (anche quando si ha un solo statement)
l if di t l ifLinguaggi dinamici – A.A. 2009/2010
65
� else if diventa elsif
Costrutti condizionali
� Costrutto unless: duale dell'if-then-elseunless (condizione) {unless (condizione) {
statement;
}
� Viene eseguito lo statement finché la condizione NON si verifica
� Perfettamente equivalente a:Perfettamente equivalente a:If (! condizione) {
statement;statement;
}
Linguaggi dinamici – A.A. 2009/201066
Etichette
� Il perl supporta le etichette, ossia sequenze di caratteri alfanumerici che possono esserecaratteri alfanumerici che possono essere raggiunte tramite comandi di salto
Una etichetta è solitamente descritta da una� Una etichetta è solitamente descritta da una stringa di caratteri in maiuscolo, terminata dal carattere speciale :carattere speciale :
LABEL:
statement;
…
� Le etichette sono usate per “bollare” i blocchi di codice relativi ai costrutti iterativi
Linguaggi dinamici – A.A. 2009/201067
Comandi di salto
� Comando goto: permette di saltare ad una specifica etichettaspecifica etichetta
goto LABEL;
C d t� Comando next:
� Salta alla prossima iterazione di un ciclo
� Se accompagnato da una label, salta direttamente alla label
Linguaggi dinamici – A.A. 2009/201068
Comandi di salto
� Comando last:
Finisce un ciclo� Finisce un ciclo
� Se accompagnato da una label, salta alla label per l'ultima volta
� Comando redo:
� Ripete l'iterazione corrente del ciclo
� Se accompagnato da una label ripete� Se accompagnato da una label, ripete l'iterazione associata alla stessa
Linguaggi dinamici – A.A. 2009/201069
Comandi di salto
� Attenzione!I comandi di salto (soprattutto il goto)� I comandi di salto (soprattutto il goto) potrebbero rendere meno chiaro il flusso di esecuzione del programmaesecuzione del programma
� E non sono essenziali per l’espressivitàAlt i t tti ti l l� Altri costrutti possono essere usati al loro posto
Ma a volte sono comodi!� Ma a volte sono comodi!
Linguaggi dinamici – A.A. 2009/201070
Costrutti iterativi
� Costrutto while: identico al linguaggio Cwhile (condizione) {while (condizione) {
statement;
}
� Costrutto do-until: analogo del costrutto do-while nel linguaggio C
do {{
statement;
} until (condizione);} until (condizione);
Linguaggi dinamici – A.A. 2009/201071
Costrutti iterativi
� Costrutto for: simile al linguaggio CLABEL:LABEL:
for (espr1; espr2; espr3) {
statement;
}
� espr1 definisce il valore iniziale dell'indice nell'iterazione, espr2 definisce la condizione di , pstop, espr3 definisce la modalità di incremento dell'indice
� Ne esiste anche una versione che sfrutta una lista (tipo foreach)
Linguaggi dinamici – A.A. 2009/201072
lista (tipo foreach)
Costrutti iterativi
� Costrutto foreach:LABEL:LABEL:
foreach $var (lista) {
statement;
}
� Qui, $var assume tutti i valori di una lista
foreach $count(5 4 3 2 1 “Via”) {foreach $count(5, 4, 3, 2, 1, Via ) {
print $count . “\n”;
}}
� Il costrutto foreach è molto più efficiente del
Linguaggi dinamici – A.A. 2009/201073
for, perché non deve valutare le espressioni