Pe t1 perl-intro

73
LINGUAGGI DINAMICI LINGUAGGI DINAMICI PARTE 2 IL LINGUAGGIO PERL IL LINGUAGGIO PERL Linguaggi dinamici – A.A. 2009/2010 1

Transcript of Pe t1 perl-intro

Page 1: Pe t1 perl-intro

LINGUAGGI DINAMICILINGUAGGI DINAMICIPARTE 2

IL LINGUAGGIO PERLIL LINGUAGGIO PERL

Linguaggi dinamici – A.A. 2009/20101

Page 2: Pe t1 perl-intro

Parte 2

Introduzione al Perl

Linguaggi dinamici – A.A. 2009/20102

Page 3: Pe t1 perl-intro

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

Page 4: Pe t1 perl-intro

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

Page 5: Pe t1 perl-intro

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

Page 6: Pe t1 perl-intro

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

Page 7: Pe t1 perl-intro

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

Page 8: Pe t1 perl-intro

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

Page 9: Pe t1 perl-intro

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

Page 10: Pe t1 perl-intro

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

Page 11: Pe t1 perl-intro

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

Page 12: Pe t1 perl-intro

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

Page 13: Pe t1 perl-intro

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

Page 14: Pe t1 perl-intro

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

Page 15: Pe t1 perl-intro

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

Page 16: Pe t1 perl-intro

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

Page 17: Pe t1 perl-intro

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

Page 18: Pe t1 perl-intro

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

Page 19: Pe t1 perl-intro

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

Page 20: Pe t1 perl-intro

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

Page 21: Pe t1 perl-intro

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

Page 22: Pe t1 perl-intro

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

Page 23: Pe t1 perl-intro

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

Page 24: Pe t1 perl-intro

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

Page 25: Pe t1 perl-intro

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

Page 26: Pe t1 perl-intro

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

Page 27: Pe t1 perl-intro

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

Page 28: Pe t1 perl-intro

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

Page 29: Pe t1 perl-intro

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

Page 30: Pe t1 perl-intro

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

Page 31: Pe t1 perl-intro

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

Page 32: Pe t1 perl-intro

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

Page 33: Pe t1 perl-intro

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

Page 34: Pe t1 perl-intro

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

Page 35: Pe t1 perl-intro

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

Page 36: Pe t1 perl-intro

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

Page 37: Pe t1 perl-intro

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

Page 38: Pe t1 perl-intro

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

Page 39: Pe t1 perl-intro

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

Page 40: Pe t1 perl-intro

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

Page 41: Pe t1 perl-intro

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

Page 42: Pe t1 perl-intro

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

Page 43: Pe t1 perl-intro

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

Page 44: Pe t1 perl-intro

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

Page 45: Pe t1 perl-intro

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];

Page 46: Pe t1 perl-intro

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

Page 47: Pe t1 perl-intro

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

Page 48: Pe t1 perl-intro

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 );

Page 49: Pe t1 perl-intro

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

Page 50: Pe t1 perl-intro

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

Page 51: Pe t1 perl-intro

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

Page 52: Pe t1 perl-intro

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

Page 53: Pe t1 perl-intro

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

)

Page 54: Pe t1 perl-intro

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

Page 55: Pe t1 perl-intro

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

Page 56: Pe t1 perl-intro

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

Page 57: Pe t1 perl-intro

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

Page 58: Pe t1 perl-intro

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

Page 59: Pe t1 perl-intro

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

Page 60: Pe t1 perl-intro

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

Page 61: Pe t1 perl-intro

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 è!)

Page 62: Pe t1 perl-intro

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

Page 63: Pe t1 perl-intro

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

Page 64: Pe t1 perl-intro

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

Page 65: Pe t1 perl-intro

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

Page 66: Pe t1 perl-intro

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

Page 67: Pe t1 perl-intro

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

Page 68: Pe t1 perl-intro

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

Page 69: Pe t1 perl-intro

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

Page 70: Pe t1 perl-intro

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

Page 71: Pe t1 perl-intro

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

Page 72: Pe t1 perl-intro

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)

Page 73: Pe t1 perl-intro

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