Pe t1 perl-intro

679 views
619 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
679
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Pe t1 perl-intro

  1. 1. LINGUAGGI DINAMICI PARTE 2 IL LINGUAGGIO PERL Linguaggi dinamici – A.A. 2009/2010 1
  2. 2. Parte 2 Introduzione al Perl Linguaggi dinamici – A.A. 2009/2010 2
  3. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×