50

In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

  • Upload
    others

  • View
    25

  • Download
    0

Embed Size (px)

Citation preview

Page 1: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Introduzione al PerlDispense del corso di introduzione alla programmazione in Perl

Marco Liverani

[email protected] { [email protected], Settembre 1996

Page 2: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Questo fascicolo �e stato prodotto utilizzando il software LATEX 2.09 in ambiente Linux. I

numerosi esempi presenti nel testo sono stati veri�cati utilizzando l'interprete Perl v. 5.001

in ambiente Linux.

Prima versione Settembre 1996

Copyright c 1996 Marco Liverani

Questa guida pu�o essere liberamente fotocopiata o riprodotta con ogni altro mezzo, purch�e

sia distribuita integralmente e gratuitamente, senza scopo di lucro. Quanto riportato nella

guida pu�o essere citato liberamente, purch�e ci�o avvenga nel rispetto del copyright che

rimane di propriet�a dell'autore.

Page 3: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Indice

Introduzione iii

1 Introduzione alla programmazione 1

1.1 Algoritmi : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 11.2 Diagrammi di usso : : : : : : : : : : : : : : : : : : : : : : : : : : : 31.3 Programmazione strutturata : : : : : : : : : : : : : : : : : : : : : : : 31.4 Compilatori ed interpreti : : : : : : : : : : : : : : : : : : : : : : : : : 41.5 Cenni sulle strutture dati : : : : : : : : : : : : : : : : : : : : : : : : 5

1.5.1 Variabili e tipi : : : : : : : : : : : : : : : : : : : : : : : : : : 51.5.2 Array : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 61.5.3 Liste e gra� : : : : : : : : : : : : : : : : : : : : : : : : : : : : 71.5.4 File : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7

2 Introduzione al Perl 9

2.1 Finalit�a del Perl : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 92.2 Intestazione di un programma : : : : : : : : : : : : : : : : : : : : : : 92.3 Istruzioni di base : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 102.4 Input/output su �le : : : : : : : : : : : : : : : : : : : : : : : : : : : 12

3 Strutture dati in Perl 15

3.1 Variabili scalari ed array : : : : : : : : : : : : : : : : : : : : : : : : : 153.2 Liste ed array associativi : : : : : : : : : : : : : : : : : : : : : : : : : 163.3 Apici, stringhe ed interpolazione : : : : : : : : : : : : : : : : : : : : : 183.4 Operatori : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 19

4 Strutture di controllo 21

4.1 Operatori logici : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 214.2 Operatori di Confronto : : : : : : : : : : : : : : : : : : : : : : : : : : 214.3 Struttura condizionale if-else : : : : : : : : : : : : : : : : : : : : : : : 224.4 Il ciclo while : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 244.5 Il ciclo for : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 254.6 Altre istruzioni di controllo : : : : : : : : : : : : : : : : : : : : : : : 25

5 Pattern matching 27

5.1 Espressioni regolari : : : : : : : : : : : : : : : : : : : : : : : : : : : : 275.2 Pattern matching : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 285.3 Pattern substitution : : : : : : : : : : : : : : : : : : : : : : : : : : : 29

6 Variabili speciali 31

6.1 Argomenti su riga di comando e variabili di ambiente : : : : : : : : : 316.2 Variabili speciali sul pattern matching : : : : : : : : : : : : : : : : : 326.3 Variabili speciali e �le : : : : : : : : : : : : : : : : : : : : : : : : : : 326.4 Variabili speciali e processi : : : : : : : : : : : : : : : : : : : : : : : 32

i

Page 4: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

ii INDICE

7 Subroutine 33

7.1 Subroutine : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 337.2 Ricorsione : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 347.3 Programmi esterni : : : : : : : : : : : : : : : : : : : : : : : : : : : : 34

7.3.1 Chiamata mediante apici inversi : : : : : : : : : : : : : : : : 357.3.2 Le funzioni system ed exec : : : : : : : : : : : : : : : : : : : 357.3.3 Esecuzione mediante il canale di pipe : : : : : : : : : : : : : : 35

7.4 Librerie esterne : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 367.5 Valutazione di espressioni : : : : : : : : : : : : : : : : : : : : : : : : 36

8 Funzioni principali 39

8.1 Funzioni aritmetiche : : : : : : : : : : : : : : : : : : : : : : : : : : : 398.2 Funzioni di conversione : : : : : : : : : : : : : : : : : : : : : : : : : : 398.3 Funzioni su stringhe : : : : : : : : : : : : : : : : : : : : : : : : : : : 398.4 Funzioni su array e liste : : : : : : : : : : : : : : : : : : : : : : : : : 408.5 Funzioni su �le e directory : : : : : : : : : : : : : : : : : : : : : : : : 408.6 Funzioni di Input/Output : : : : : : : : : : : : : : : : : : : : : : : : 41

Indice analitico 43

Page 5: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Introduzione

Il linguaggio Perl �e uno strumento formidabile: al tempo stesso un po' magico edestremamente elegante, potente e compatto. Superate le prime resistenze di chi tra-dizionalmente ha avuto a che fare con linguaggi di programmazione come C, Fortrano Pascal, il Perl si lascer�a apprezzare per le sue doti straordinarie. Innanzi tuttola compattezza: oltre ad essere uno dei suoi maggiori pregi �e all'inizio anche il pi�ugrosso ostacolo; gli script dei programmatori esperti risultano essere molto sinteticie poco comprensibili per un principiante. Con il tempo, acquistando familiarit�acon il linguaggio tutto apparir�a estremamente chiaro e l'eleganza del Perl potr�a es-sere apprezzata in ogni sua parte. Anzi potr�a anche accadere di trovare fastidiosecerte ridondanze e la pignoleria delle de�nizioni presenti in altri linguaggi di pro-grammazione. In�ne la potenza: con poche istruzioni saremo in grado di compiereoperazioni che con altri strumenti sarebbero risultate talmente complesse o noioseche spesso si sarebbe cercato di agirare il temuto ostacolo. Col passare del tempoe con l'aumentare della mia esperienza nell'uso del Perl non �e a�atto diminuitolo stupore per l'eleganza, la sinteticit�a e l'e�cacia con cui il Perl mi premette die�ettuare determinate operazioni: �e per questo che lo considero uno strumento cir-condato da un alone di magia che non si �nisce mai di studiare e che rivela in ognioccasione un nuovo modo in cui il medesimo algoritmo pu�o essere implementato.

Oggi il Perl gode di una certa notoriet�a in quanto �e probabilmente lo strumentopi�u usato per sviluppare script CGI su server HTTP nel mondo Internet ed Intranet.

Il linguaggio Perl si sposa perfettamente con il sistema UNIX; anche se oggine sono stati e�ettuati dei porting su numerose altre piattaforme (OS/2, MS-DOS,Windows 95, Windows NT, solo per citarne alcune) l'ambiente pi�u naturale per

sviluppare ed eseguire script in Perl rimane UNIX, dove �e possibile integrare e farinteragire gli script con i numerosi strumenti presenti nel sistema (sto pensando ased, awk, grep, mail e pi�u in generale alle modalit�a operative e di intercomunicazionetra i processi o�erte da questo ambiente) ed ottenere il meglio dal linguaggio.

Chi ha gi�a un po' di esperienza con UNIX e con alcuni suoi strumenti (vi, grep,ecc.) si trover�a un passo avanti rispetto ad altri nell'esplorazione del linguaggio.Tuttavia questo brevissimo fascicolo �e stato pensato come uno strumento elementa-re per un primo approccio al Perl: nessun prerequisito �e richiesto per a�rontare lalettura di queste pagine; �e per�o utile poter disporre di un interprete Perl per e�et-tuare direttamente le prove ed i test necessari, anche solo sperimentando gli esempiproposti nei vari capitoli.

Questo fascicolo non ha la pretesa di trattare in modo esaustivo l'argomento: si

tratta semplicemente di un'introduzione elementare per chi non ha mai utilizzato ilPerl e, prima di a�rontare letture pi�u approfondite ed impegnative, decide di volerdare uno sguardo ad ampio raggio alle potenzialit�a o�erte dal linguaggio.

Per chi desiderasse sapere tutto sul Perl consiglio sicuramente la lettura dell'ot-timo testo di Larry Wall (autore del Perl) e Randal L. Schwartz, Programming Perl,edito dalla O'Reilly & Associates (1991). Questo libro ha un approccio didattica-mente assai interessante: in un primo capitolo descrive con una serie di esempipratici le principali caratteristiche del linguaggio, mettendo l'utente smaliziato nelle

iii

Page 6: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

iv INTRODUZIONE

condizioni di scrivere i primi script di una certa sostanza. Seguono quindi un paiodi capitoli in cui si entra nei dettagli dei vari aspetti del Perl. In�ne ampio spazio�e lasciato alla soluzione di problemi pratici (practical programming) anche di unacerta complessit�a.

Una guida sintetica di riferimento �e invece o�erta dal libricino di Johan Vromans,Perl 5 { Desktop Reference, edito dalla stessa O'Reilly & Associates (1996).

Per un approccio pi�u tradizionale e \passo-passo" al linguaggio, �e anche daricordare il testo di Randal L. Schwartz, Learning Perl, sempre della O'Reilly &Associates (1993).

Questo fascicolo �e strutturato in otto brevi capitoli. Il primo �e una introduzionesintetica ed informale alla programmazione ed ai concetti riguardanti le strutturedati. Sono stato a lungo incerto sull'opportunit�a di inserire un capitolo come questoin una guida introduttiva al Perl. Alla �ne ho deciso di lasciare questo primo capitolonella speranza che possa essere utile a quanti si accostano per la prima volta allaprogrammazione e quindi necessitano se non altro di una prima infarinatura sullaterminologia usata in questo contesto.

Il secondo capitolo introduce, in modo forse un po' brusco ed informale, le basidel linguaggio Perl. Nel capitolo 3 questi concetti vengono sviluppati introducendole strutture dati in Perl. Nel capitolo 4 vengono a�rontati gli operatori logici e lestrutture di controllo del linguaggio. Il capitolo 5 a�ronta uno degli aspetti pi�u im-portanti ed interessanti del linguaggio: le espressioni regolari ed il pattern matching.Nel sesto capitolo vengono esaminate in estrema sintesi alcune delle variabili specialiusate dal linguaggio, mentre nel capitolo 7 si a�ronta il problema dell'interazione diuno script Perl con altri programmi esterni. Il capitolo 8 riporta una descrizionesintetica delle principali istruzioni divise per categorie funzionali.

Come si intuir�a �n dalle prime pagine, in questo fascicolo non sono mai entratonei dettagli di ci�o che espongo: descrivere ogni particolare sintattico delle istruzio-ni del linguaggio sarebbe stato assai noioso ed avrebbe trasformato questa guidaintroduttiva in un manuale tecnico. L'approccio scelto �e stato molto diverso: hopreferito fornire una serie di ash ad ampio spettro sulle possibilit�a o�erte dal lin-guaggio, lasciando il compito di chiarire (o far intuire) alcuni dettagli sintattici ainumerosi esempi e tabelle presenti in ogni capitolo.

Le convenzioni tipogra�che impiegate nel testo sono quelle ormai consuete perquesto genere di pubblicazione: con il carattere typewriter ho indicato le istruzioniPerl o l'output di un comando; il carattere slanted �e stato usato per rappresentarel'input immesso dall'utente, mentre nella descrizione delle istruzioni il carattere italic�e stato usato per descrivere ci�o che dovr�a essere sostituito con le variabili e leespressioni vere e proprie nel programma dell'utente.

Spero con questo fascicolo di avere e�ettivamente fornito un utile strumento di-dattico e non soltanto di aver riprodotto in forma sintetica ci�o che meglio di mehanno gi�a scritto altri autori. Ogni eventuale commento, suggerimento, critica, sar�abene accetto: le mie mailbox sono sempre aperte per chiunque!

M. L. ([email protected], [email protected])Roma, Settembre 1996

Page 7: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 1

Introduzione alla

programmazione

Questo primo capitolo �e da intendersi un po' come un capitolo zero: tratteremo inmodo estremamente sintetico e con una terminologia necessariamente informale etalvolta priva del necessario rigore gli aspetti di base della programmazione. Conqueste pagine non si intende certo fornire uno strumento esaustivo per chi non hamai scritto un programma per un calcolatore elettronico, tuttavia potranno essereutili ai lettori meno esperti per acquisire una terminologia che riprenderemo spessonei capitoli seguenti.

1.1 Algoritmi

Un computer �e una macchina costituita da un insieme di componenti elettroniche:�e facile immaginare quindi, come tutto il funzionamento della macchina dipendada un usso continuo di segnali elettrici, sincronizzati da un clock, che codi�cano,in notazione binaria, le informazioni immagazzinate ed elaborate all'interno dellamacchina stessa.

Per quanto possa essere complessa e so�sticata l'architettura di un elaboratoreelettronico, questo potrebbe sembrare non molto dissimile da un qualsiasi altroelettrodomestico presente nella nostra casa. Tuttavia esiste una di�erenza sostan-ziale tra un computer ed una lavatrice: per quanto moderna e dotata di so�sticatimeccanismi elettronici, una lavatrice potr�a sempre e solo lavare dei panni, mentre ilcomputer pu�o essere istruito per svolgere compiti anche molto di�erenti tra di loro.

Come si istruisce un computer? Mediante un programma, ossia tramite una se-quenza ben de�nita di istruzioni che la macchina �e in grado di tradurre in funzionielementari facilmente eseguibili. Schematicamente possiamo dire che le caratteristi-che principali di un calcolatore sono:

� velocit�a: �e rapidissimo nell'eseguire i compiti che gli vengono assegnati;

� precisione: �e estremamente preciso nell'eseguire calcoli matematici e logici;

� a�dabilit�a: svolge con rigore e puntualit�a i compiti assegnati dall'utente;

� duttilit�a: �e in grado (se programmato correttamente) di svolgere lavori assaidiversi.

Come rovescio della medaglia di queste caratteristiche \positive", possiamo in-dividuare alcune caratteristiche \negative" di cui �e bene tenere conto:

1

Page 8: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

2 CAPITOLO 1. INTRODUZIONE ALLA PROGRAMMAZIONE

� �e privo di \buon senso" e di intuizione;

� �e incapace di veri�care se c'�e corrispondenza tra quanto sta facendo e gliobbiettivi del programmatore.

Riassumendo, possiamo dire che il calcolatore �e un esecutore di ordini impartitidall'utente-programmatore, assai preciso ed e�ciente, ma un po' stupido, si limitacio�e ad eseguire ci�o che gli viene chiesto, a prescindere dalla correttezza di quantogli viene ordinato di compiere ai �ni della soluzione del problema (in un certo sensosi pu�o dire che �e un po' cieco).

Per capire meglio quanto �e stato detto vediamo un esempio elementare di pro-gramma per un calcolatore elettronico. Supponiamo che il problema da risolvere siaquello di e�ettuare la media aritmetica tra 5 numeri forniti dall'utente. Il calcolatoredeve leggere in input i cinque numeri, sommarli, memorizzando la sommada qualcheparte nella sua memoria ed in�ne dividere per cinque la somma totale e stampare ilrisultato. Una codi�ca di questo algoritmo risolutore potrebbe essere la seguente:

1. assegna ad n il valore 0

2. assegna ad s il valore 0

3. leggi un numero in input ed assegnalo ad a

4. incrementa di 1 il valore di n

5. somma a ed s ed assegna il risultato ad s

6. se n �e minore di 5 vai al passo 3 altrimenti prosegui

7. dividi s per 5 ed assegna il risultato ad m

8. visualizza il valore di m.

9. fermati

Eseguendo in sequenza le istruzioni del programma (che sono evidentementemolto elementari), il calcolatore �e in grado di risolvere il problema che noi ci erava-mo posti. Naturalmente l'algoritmo �e espresso in lingua italiana: per essere capitodal computer sarebbe stato necessario tradurlo in linguaggio macchina (un linguag-gio assai ostico ed innaturale, basato essenzialmente sulla codi�ca binaria su cuiil computer �e in grado di operare). Il linguaggio macchina ed il nostro linguag-gio naturale sono estremamente distanti fra di loro: quest'ultimo pieno di ambiguesfumature, estremamente coinciso e criptico il primo; per raggiungere un buon com-promesso tra le due parti che si devono comprendere (noi e la macchina) sono statiprogettati numerosi linguaggi di programmazione ad alto livello, ovvero un insiemedi parole chiave e di regole sintattiche, non troppo distanti dal nostro linguaggionaturale, ma facilmente traducibili (in modo automatico, mediante un programmachiamato compilatore) in istruzioni di linguaggio macchina.

Ogni programma per un calcolatore elettronico, utilizza la logica ed i concettiespressi (in estrema sintesi) nei paragra� precedenti. �E bene saperlo, anche semagari non ci si trover�a mai a dover scrivere un programma, perch�e questo pu�oaiutarci a capire che quasi sempre, quando il calcolatore non esegue ci�o che noivorremmo, a meno di guasti hardware non �e lui che sbaglia, ma siamo noi ad averfornito delle istruzioni incomplete o fuorvianti che non lo portano a raggiungere lasoluzione cercata.

Page 9: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

1.2. DIAGRAMMI DI FLUSSO 3

1.2 Diagrammi di usso

�E spesso utile aiutarsi nella progettazione di un algoritmo, mediante la stesura diappositi diagrammi di usso che, con una simbologia standard, ci permettono dirappresentare gra�camente il usso seguito dall'elaboratore durante l'esecuzione delnostro programma.

In generale, le operazioni fondamentali che �e possibile compiere mediante unprogramma deterministico sono cinque:

1. leggere un input dall'esterno e memorizzarlo in una cella di memoria;

2. compiere operazioni elementari sui dati contenuti nelle celle di memoria, me-morizzando il risultato di tali operazioni in altre celle;

3. scrivere in output il contenuto di una cella di memoria;

4. confrontare il contenuto di due celle di memoria ed e�ettuare due operazionidi�erenti in base all'esito di tale confronto;

5. e�ettuare dei salti che modi�chino il usso sequenziale dell'algoritmo.

Nella rappresentazione di un algoritmo mediante un diagramma di usso si usaun simbolo diverso per ognuna di queste operazioni:

����Input e Output

Assegnazioni

XXX���XXX��� Test e confronti

- Salti

Inizio e stop

Figura 1.1: Simbologia utilizzata nella stesura di diagrammi di usso

L'esempio riportato nella pagina precedente potrebbe quindi essere rappresentatocon il diagramma di usso rappresentato in �gura 1.2.

1.3 Programmazione strutturata

Per rendere pi�u chiari e leggibili i programmi �e opportuno rifarsi alle regole dellaprogrammazione strutturata. Questo paradigma impone l'uso esclusivo di tre strut-ture di base per la costruzione di ogni algoritmo. Queste tre strutture possono

essere combinate tra loro, giustapponendole o nidi�candole una dentro l'altra. Letre strutture sono rappresentate in �gura 1.3.

Ci�o che �e assolutamente \proibito" dalle regole della programmazione strutturata�e l'inserimento di salti (\go to") al di fuori delle strutture iterativa e condizionale;questi salti renderebbero particolarmente illeggibile e poco ordinata la struttura delprogramma, con pesanti conseguenze sulla sua e�cienza e sulla possibilit�a di ap-portarvi delle correzioni. In caso di programmi scritti con uno stile particolarmentedisordinato si parla di \spaghetti programming".

Page 10: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

4 CAPITOLO 1. INTRODUZIONE ALLA PROGRAMMAZIONE

�Start

?

n = 0; s = 0

?����

��leggi a

?

n = n+ 1

?

s = s + a

?PPPPP

�����PP

PPP��

���n < 5 ?S��

?No

m = s=5

?����

��scrivi m

?�

�Stop

Figura 1.2: Diagramma di usso dell'esempio delle pagine precedenti

1.4 Compilatori ed interpreti

Per poter essere eseguito da un elaboratore elettronico, ogni algoritmo deve esserecodi�cato mediante le parole chiave di un linguaggio di programmazione. Un similelinguaggio �e costituito da un insieme di parole e di regole sintattiche che ci con-sentono di tradurre in termini precisi e non ambigui i singoli passi che costituisconoun algoritmo. In un certo senso si pu�o anche pensare ad un linguaggio di program-mazione, come ad un tramite tra la nostra lingua parlata (ricca di forme e sfumatureche la rendono ambigua ed inadatta a comunicare con una macchina) ed il linguaggiodell'elaboratore elettronico, il cosiddetto linguaggio macchina (che al contrario della

nostra lingua parlata �e un linguaggio assai povero di espressioni, ma dotato di unaprecisione \millimetrica").

Il calcolatore non �e in grado di tradurre in operazioni da eseguire le istruzionicodi�cate mediante un linguaggio di programmazione. L'unico linguaggio con cui ilcomputer �e in grado di operare �e il linguaggiomacchina. Dobbiamo quindi dotarci diappositi programmi (scritti in linguaggiomacchina!) che si occupino della traduzionedelle istruzioni dei nostri programmi scritti con un linguaggio di programmazione,nel linguaggio della macchina.

Page 11: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

1.5. CENNI SULLE STRUTTURE DATI 5

Sequenziale

?

?

Iterativa

?

?

Condizionale

?�� QQQQ ��? ?

?

Figura 1.3: Le tre regole della programmazione strutturata

Questo tipo di programmi traduttori sono classi�cabili in due categorie principali,in base al loro modo di operare la traduzione:

compilatori: e�ettuano la traduzione delle righe del programmauna volta per tuttee producono in output un programma in linguaggio macchina equivalente aquello fornito in input dal programmatore; il programma compilato potr�a poiessere eseguito pi�u volte senza che sia necessaria ogni volta una operazione ditraduzione;

interpreti: e�ettuano la traduzione di una istruzione di programma per volta ela eseguono immediatamente dopo averla tradotta; quindi ogni volta che siesegue un programma l'interprete lo traduce un'istruzione dopo l'altra durantel'esecuzione.

Il vantaggio dell'uso di un interprete rispetto ad un compilatore sta nel fattoche il programma sorgente pu�o essere modi�cato in ogni momento e poi inviato im-mediatamente in esecuzione, senza la necessit�a di dover eseguire ulteriori passaggi.In generale per�o, un programma compilato �e molto pi�u e�ciente di un programmainterpretato. Il Perl1, oggetto di queste dispense, �e un linguaggio interpretato, magarantisce una elevata e�cienza grazie al fatto che integra delle macro istruzioni gi�apronte per essere utilizzate. Uno dei pi�u famosi linguaggi di programmazione, ilBASIC2, �e spesso un linguaggio interpretato. Viceversa il C, il Fortran ed il Pascalsono dei linguaggi dotati di un compilatore.

1.5 Cenni sulle strutture dati

Abbiamo accennato nelle pagine precedenti al fatto che l'elaboratore elettronico �ein grado di memorizzare i dati su cui opera in apposite celle di memoria. Questecelle possono essere utilizzate con un linguaggio di programmazione di alto livello,mediante l'uso delle variabili.

1.5.1 Variabili e tipi

Le variabili sono delle strutture in cui �e possibile memorizzare dei dati. L'uso dellevariabili sempli�ca di molto l'accesso diretto alle locazioni di memoria3. La memoria

1Perl �e un acronimo: Practical Extraction and Report Language2BASIC: Beginner Allporpouse Symbolic Instruction Code3La memoria RAM (Random Access Memory) di un calcolatore elettronico �e organizzata in

celle, chiamate locazioni di memoria; ogni cella �e identi�cata da un indirizzo numerico.

Page 12: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

6 CAPITOLO 1. INTRODUZIONE ALLA PROGRAMMAZIONE

RAM di un computer �e un insiememolto grande di bit, che possono assumere il valoredi zero o uno (acceso o spento). Un gruppo di 8 bit costituisce un byte; gruppi didue, tre, quattro, otto byte costituiscono una parola, la cui lunghezza varia a secondadell'architettura hardware della macchina (si parla in questo caso di macchine a 16,24, 32 o 64 bit).

Per rappresentare in notazione binaria un numero intero compreso tra 0 e 255,sono necessari 8 bit (1 byte). Ogni carattere alfabetico e di punteggiatura pu�o esserecodi�cato mediante un numero compreso tra 0 e 127, quindi per rappresentare uncarattere alfanumerico nella memoria di un computer �e su�ciente un byte. Permemorizzare una parola di 10 caratteri saranno necessari 10 byte.

Esistono diversi tipi di dato che possono essere memorizzati all'interno di uncalcolatore elettronico, in particolare di solito distinguiamo i seguenti:

� numeri interi;

� numeri razionali, cio�e i numeri \con la virgola" ( oating point);

� caratteri alfanumerici;

� stringhe (sequenze di caratteri alfanumerici);

� puntatori.

I puntatori sono un tipo di dato fondamentale in un linguaggio come il C. Inpratica un puntatore �e una struttura dati che permette di memorizzare l'indirizzo dimemoria di un'altra variabile. In Perl non faremo uso di puntatori, visto che non siaccede mai direttamente alle locazioni di memoria della macchina.

La maggior comodit�a nell'uso delle variabili sta nel non doversi preoccupare (senon in casi particolari) della dimensione in bit del dato che intendiamo trattare enel poter attribuire un identi�cativo mnemonico (nome della variabile) alle variabilistesse.

Cos�� invece di dover lavorare a diretto contatto con le locazioni di memoria e iloro indirizzi, per memorizzare un numero o una parola ci baster�a assegnarla ad unavariabile: \$a=13", oppure \$b="casa"", \$nome="Marco"", \$x=$y+$z-17" e cos��via.

I linguaggi di programmazione tradizonali, come il Fortran, il Pascal o il BASIC,richiedono che sia de�nita a priori il tipo di ogni variabile: se la variabile \a" �e ditipo numerico intero, non potr�a contenere null'altro che numeri interi; se la variabile\b" �e una variabile stringa, non potr�a contenere altro che sequenze di caratterialfanumerici. Inoltre le operazioni consentite sulle variabili dipenderanno dal tipodi variabili usate (ad esempio sar�a possibile e�ettuare il prodotto tra due numeri,ma non tra due stringhe).

In Perl (ma gi�a in C �e presente questo principio) i tipi di dato tendono a con-fondersi; in ogni caso l'interprete del linguaggio si regola di volta in volta in base alcontesto. Ad esempio se imposteremo \$a=3", allora vorr�a dire che la variabile$a �e intera, mentre impostando \$a="gatto"" comunicheremo automaticamenteall'interprete che la variabile $a in questo contesto �e da considerarsi una stringa.

1.5.2 Array

Un array �e una struttura dati che ci permette di accedere ad un insieme di variabiliidenti�cate da uno stesso nome. Un array ha una lunghezza pari al numero divariabili di cui �e costituito. Pu�o essere comodo pensare ad un array come ad unatabella costituita da una o pi�u righe e da pi�u colonne. Se l'array �e formato daun'unica riga allora si parler�a di vettore, altrimenti parleremo di matrice.

Page 13: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

1.5. CENNI SULLE STRUTTURE DATI 7

Gli elementi dell'array (le variabili che lo costituiscono) sono identi�cate dallostesso nome dell'array e da uno o pi�u indici, che indicano la posizione dell'elementoall'intero del vettore o della matrice.

Ad esempio, pensiamo di voler memorizzare i nomi dei giorni della settimanaall'interno dell'array di tipo stringa chiamato giorno; avremo la seguente struttura:

$giorno[0] = "lunedi'"

$giorno[1] = "martedi'"

$giorno[2] = "mercoledi'"

$giorno[3] = "giovedi'"

$giorno[4] = "venerdi'"

$giorno[5] = "sabato"

$giorno[6] = "domenica"

In Perl, come vedremo in seguito, gli indici degli elementi degli array comincianodal numero 0; se l'array ha n elementi, allora l'indice dell'ultimo elemento sar�a n�1.

1.5.3 Liste e gra�

Una lista �e una struttura simile a quella di un vettore; a di�erenza degli array,la lunghezza della lista pu�o variare in ogni momento aggiungendo o rimuovendoelementi; inoltre non �e possibile raggiungere direttamente un preciso elemento dellalista stessa, perch�e gli elementi non sono indicizzati come in un vettore: �e necessarioquindi scorrere la lista dal primo elemento, �no a quando non viene identi�catol'elemento desiderato.

Un grafo �e una generalizzazione di una lista: nelle liste ogni elemento ha unsuccessore (escluso l'ultimo) ed un predecessore (escluso il primo); in un grafo invecela struttura pu�o essere molto pi�u \intricata": un elemento pu�o avere pi�u successorie pi�u predecessori.

t t

t t

-�������3-

?

Grafo orientato

t t t t- - -Lista

Figura 1.4: Esempio di lista e grafo orientato

1.5.4 File

Quando si memorizza un dato su un supporto magnetico come un hard disk oun nastro, o pi�u in generale su un'unit�a di memoria di massa, lo si memorizzautilizzando una struttura chiamata �le. Un �le �e una sequenza di byte; ai nostri �niun byte equivale ad un carattere. Il sistema non impone al �le nessun tipo di strut-tura e non assegna nessun signi�cato al suo contenuto. I byte assumono signi�cato

in funzione del programma che li interpreta . Inoltre, come vedremo, tutto questo �evero non solo per i �le su disco, ma anche per le periferiche. I dischi, i messaggi diposta elettronica in partenza ed in arrivo, i caratteri battuti sulla tastiera, l'output

Page 14: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

8 CAPITOLO 1. INTRODUZIONE ALLA PROGRAMMAZIONE

sul video del terminale, i dati che passano da un programma all'altro attraverso ipipe sono tutti visti dal sistema e dai programmi da esso gestiti come �le, ed inquanto tali non sono altro che sequenze di byte.

Per operare su di un �le �e necessario \aprirlo" associandogli un puntatore (hand-ler) per successivi riferimenti. Al termine delle operazioni sul �le, questo dovr�aessere \chiuso"; questa operazione implica la distruzione del puntatore al �le stesso.

Page 15: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 2

Introduzione al Perl

In questo capitolo eviteremo di approfondire la trattazione teorica degli argomenti,per cercare di dare una visione sintetica ed orientata ad aspetti pi�u prettamentepratici e sintattici, che ci possano introdurre all'uso del linguaggio.

2.1 Finalit�a del Perl

Il Perl (Processing Estraction Report Language) �e un linguaggio �nalizzato princi-palmente alla trattazione di stringhe e �le di testo. Ci�o che in Perl �e estremamentenaturale fare �e e�ettuare ricerche di sequenze di caratteri all'interno di stringhe (pat-tern matching), sostituzioni di sottostringhe (pattern substitution), operazioni su �ledi testo strutturati in campi e record oppure non strutturati.

Per questi motivi il Perl �e utilizzato pesantemente nella scrittura di procedu-re CGI1 installate su un server web, o per lo sviluppo di procedure di manuten-zione delle attivit�a di un server. Per gli stessi motivi il Perl non �e invece indi-cato per sviluppare procedure di puro calcolo scienti�co o comunque programmiche richiedano una elevata velocit�a e precisione nell'e�ettuare calcoli o elaborazioninumeriche complesse.

2.2 Intestazione di un programma

Abbiamo detto che il Perl �e un linguaggio interpretato, quindi ogni script in Perlrichiede di essere lanciato attraverso l'interprete per poter essere eseguito. Consi-deriamo il seguente esempio elementare, costituito da un'unica riga di programma:

print "Salve a tutti\n";

Innanzi tutto dovremo scrivere questo \programma" con un editor su un �le ditesto, quindi, una volta salvato il �le su disco, ad esempio con il nome salve.pl,potremo passarlo all'interprete attraverso il comando2:

$ perl salve.pl

Salve a tutti

$

1CGI: Common Gateway Interface, �e l'interfaccia tra le pagine web HTML e le procedure cheelaborano i dati passati da tali pagine e forniscono in output dati in formato HTML.

2D'ora in avanti supporremodi utilizzareun sistema UNIX, quindi, dove sar�a necessario, faremoriferimento ai comandi della shell UNIX ed alle peculiarit�a di questo sistema; il simbolo \$" sta adindicare il prompt della shell.

9

Page 16: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

10 CAPITOLO 2. INTRODUZIONE AL PERL

Questo comando comunica al sistema di lanciare l'interprete Perl e di passarglicome input il contenuto del �le salve.pl. L'output del programma viene visualizza-to sul terminale dell'utente, quindi lo script termina e viene visualizzato nuovamenteil prompt del sistema. La sequenza di controllo \\n" inserita alla �ne del messaggioda stampare indica all'interprete di inserire un ritorno a capo (newline) in quellaposizione.

Un modo pi�u comodo per richiamare l'interprete Perl ed eseguire un certo script �equello di speci�care direttamente nell'intestazione dello script il nome dell'interpreteche dovr�a eseguirlo. La sintassi da utilizzare �e in questo caso quella consuetadegli shell-script UNIX. Supponiamo ad esempio che l'interprete Perl sia il �le/usr/local/bin/perl3; il nostro programmino potr�a essere riscritto nel modoseguente:

#!/usr/local/bin/perl

print "Salve a tutti\n";

La prima riga del �le inizia con la sequenza \#!" (cancelletto e punto esclama-tivo) seguita dal nome dell'interprete che dovr�a eseguire il programma. A�nch�e lashell UNIX possa eseguire lo script, dovranno essere impostati i diritti di esecuzionesu questo �le con il comando chmod. Ad esempio, supponiamo di voler rendere ese-guibile il nostro script per tutti gli utenti del sistema, consentendo anche a chiunquedi leggere il contenuto del �le, ma riservando il diritto di modi�care lo script solo alproprietario del �le stesso. Il comando da impartire sar�a il seguente:

$ chmod 755 salve.pl

Per eseguire lo script a questo punto sar�a su�ciente digitarne il nome:

$ salve.pl

Salve a tutti

$

2.3 Istruzioni di base

Abbiamo gi�a visto l'istruzione print, che ci permette di stampare l'output dei nostriscript. Questa istruzione �e piuttosto potente e permette di formattare l'output invari modi utilizzando una serie di caratteri di controllo che vedremo in maggioredettaglio nelle prossime pagine.

Le variabili scalari in Perl sono precedute da un simbolo \$", in modo da distin-guerle da liste ed array. Il Perl non distingue tra variabili numeriche e stringhe: suentrambe �e consentito fare le stesse operazioni, lasciando all'interprete il compitodi assegnare un valore numerico o stringa al contenuto delle variabili a seconda delcontesto in cui queste sono usate.

Il seguente script �e una banale evoluzione dello script precedente:

#!/usr/local/bin/perl

# semplice script di esempio

$nome = "Marco";

print "Buongiorno $nome\n";

3Per conoscere l'esatta collocazione dell'interprete Perl nel �lesystem della nostra macchi-na basta dare il comando \which perl" oppure \find / -name perl -print"; se l'interprete �einstallato il sistema ne visualizzer�a il path.

Page 17: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

2.3. ISTRUZIONI DI BASE 11

Il cancelletto �e utilizzato in Perl per introdurre delle linee di commento; quindidopo un simbolo \#" potete inserire ogni tipo di commento che possa aiutare voio qualcun altro a comprendere anche a distanza di tempo il funzionamento delloscript. L'interprete Perl eviter�a di analizzare e di tradurre ogni parola che segue ilsimbolo \#" �no alla �ne della riga.

L'istruzione complementare a quella di stampa �e quella di lettura, che consentedi assegnare alle variabili dello script dei valori digitati dall'operatore o letti da un�le. Il seguente programmino �e una ulteriore evoluzione dell'esempio precedente efa uso dell'istruzione di lettura:

#!/usr/local/bin/perl

# un altro esempio elementare

print "Come ti chiami? ";

$nome = <STDIN>;

print "Buongiorno $nome\n";

Lanciando in esecuzione quest'ultima versione del programma salve.pl, il siste-ma ci chiede di inserire il nostro nome mediante la tastiera del terminale, e quandoavremo battuto RETURN per segnalare la �ne del nostro inserimento, visualizzer�ail consueto messaggio di buongiorno. Il simbolo <STDIN> �e infatti l'handler del �le diinput standard, un �le sempre aperto in lettura durante tutta l'esecuzione del pro-gramma e che rappresenta generalmente la tastiera del terminale dell'utente. Conl'istruzione $nome=<STDIN> si assegna alla variabile $nome la linea di input prove-niente dal canale di input standard, compreso il carattere di \�ne riga".

$ salve.pl

Come ti chiami? Marco

Buongiorno Marco

$

�E possibile redirigere il contenuto di un �le attraverso il canale dello standardinput utilizzando le funzionalit�a di redirezione e di piping messi a disposizione dallashell di comandi del sistema operativo. Ad esempio supponiamo di aver creato un�le di testo (chiamato nome) con il nostro editor, in cui abbiamo inserito soltantouna parola, ad esempio \Marco". Allora potremo redirigere il contenuto di questo�le verso il canale di input standard del nostro programma, nel seguente modo:

$ salve.pl < nome

Come ti chiami? Buongiorno Marco

$

Allo stesso modo in cui redirigiamo l'input standard, possiamo anche redirigereverso un �le il canale di output standard, in modo da memorizzare su �le ogni mes-saggio che il nostro programma avrebbe altrimenti visualizzato sullo schermo delterminale. Il seguente comando non produce alcun output:

$ salve.pl < nome > output

$

Infatti ci�o che il programma doveva leggere in input gli �e stato passato attraversoil �le nome, mentre l'output �e stato scritto nel �le output.

Page 18: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

12 CAPITOLO 2. INTRODUZIONE AL PERL

2.4 Input/output su �le

I canali standard di comunicazione di ogni programma sono tre e ad ognuno di questi�e associato un handler:

<STDIN> standard input

<STDOUT> standard output

<STDERR> standard error

Tabella 2.1: I �le handler standard

Cos�� come ogni input avviene di default attraverso <STDIN>, cos�� anche l'outputviene emesso attraverso <STDOUT>; in alcuni casi �e opportuno dichiarare esplicita-mente il canale di output:

print STDOUT "Buongiorno $nome\n";

Il canale <STDERR> �e simile a <STDIN>, ma viene solitamente utilizzato per visua-lizzare i messaggi di errore in modo tale che, se anche lo standard output �e redirettoattraverso un �le, il messaggio di errore viene visualizzato ugualmente sul terminaledell'utente o sulla console del sistema.

Oltre a questi �le handler standard che non �e necessario aprire o chiudere espli-citamente, �e possibile aprire anche un canale di comunicazione verso un normale �ledi testo sull'unit�a di memoria di massa.

Prima di poterlo utilizzare, un �le deve essere aperto dichiarandone anche l'usoche se ne intende fare: il �le infatti pu�o essere aperto in modalit�a di�erenti:

read: open(handle, "<nome") si possono e�ettuare solo operazioni di

lettura dal �le speci�cato;

write: open(handle, ">nome") si possono e�ettuare soltanto operazioni di

scrittura sul �le; se il �le gi�a esiste verr�a

cancellato e ne verr�a creato uno nuovo;

append: open(handle, ">>nome") si possono e�ettuare solo operazioni di

scrittura aggiungendo dati in coda al

�le; se il �le gi�a esiste in questo caso

non verr�a cancellato, se non esiste

verr�a creato;

Tabella 2.2: Modalit�a di apertura di un �le

Il seguente script legge tutte le linee di un �le di testo e le visualizza sullo schermodel terminale. Viene fatto uso della struttura di controllo while che ancora non �estata descritta; per il momento basti sapere che questa struttura consente di ripetereun certo blocco di istruzioni �ntanto che una certa condizione non risulta veri�cata.

#!/usr/local/bin/perl

# simpcat.pl: versione semplificata di 'cat'

print STDERR "nome del file: ";

$filename = <STDIN>;

open(FILE, "< $filename");

while (!eof(FILE)) {

Page 19: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

2.4. INPUT/OUTPUT SU FILE 13

$riga = <FILE>;

print "$riga";

}

Al solo scopo di cominciare ad introdurre alcuni dei comandi che diventerannodi uso comune nelle prossime pagine, possiamo riscrivere in maniera equivalente loscript precedente come segue:

#!/usr/local/bin/perl

# simpcat.pl: versione semplificata di 'cat'

$filename = $ARGV[0];

open(FILE, "< $filename") || die "Errore!\n\n";

while ($riga = <FILE>)) {

print "$riga";

}

Nel primo esempio il programma chiede di inserire il nome del �le da visualiz-zare, mentre nel secondo caso si aspetta che il nome gli venga passato come para-metro. Inoltre, nella seconda versione, se il �le risulta impossibile da aprire lo scriptvisualizza il messaggio \Errore!" e l'esecuzione ha termine.

Gi�a da queste due versioni equivalenti di un esempio cos�� elementare si intravedela grande libert�a lasciata dal Perl al programmatore: non c'�e mai un solo modo percompiere una certa operazione in Perl.

Page 20: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

14 CAPITOLO 2. INTRODUZIONE AL PERL

Page 21: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 3

Strutture dati in Perl

3.1 Variabili scalari ed array

In Perl, a di�erenza di quanto accade con altri linguaggi di programmazione, non �enecessario dichiarare le variabili prima di utilizzarle; il simbolo \$" che le precedesta ad indicare che si tratta di variabili che possono accettare un unico valore, chepotr�a essere un numero, un singolo carattere o una stringa. Chiameremo questo tipodi variabili scalari, per distinguerle da altri tipi pi�u complessi (variabili vettoriali).

L'interprete Perl, utilizzando le variabili nelle istruzioni del nostro programma,stabilir�a dal contesto se queste devono essere utilizzate come variabili numeriche ocome stringhe.

$nome = 'Marco'; stringa

$n = 3; numero intero

$x = 3.1415; numero razionale

$saluto = "Ciao $nome\n"; stringa con interpolazione

$giorno = `date`; comando

Tabella 3.1: Tipi di dato

Un array �e una struttura dati che permette di accedere ad un set di variabiliscalari direttamente attraverso un indice numerico; potremmo dire, in altri termini,che si tratta di una variabile a pi�u componenti.

I nomi degli array in Perl sono preceduti dal simbolo \@" per distinguerli dallevariabili scalari. Le singole componenti del vettore (array) sono delle variabili scalari.Ad esempio l'istruzione

@frutta = ('mele', 'pere', 'banane', 'uva');

de�nisce l'array @frutta come un vettore a quattro componenti; per accedere allasingola componente si deve usare un indice numerico, come nel seguente esempio:

#!/usr/local/bin/perl

# script "frutta.pl"

@frutta = ('mele', 'pere', 'banane', 'uva');

print "un cesto pieno di $frutta[1].\n";

Il primo elemento di un vettore in Perl ha indice 0, quindi se un vettore ha nelementi, l'ultimo elemento ha indice n�1. Ad esempio lo script precedente fornisce

15

Page 22: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

16 CAPITOLO 3. STRUTTURE DATI IN PERL

il seguente risultato:

$ frutta.pl

un cesto pieno di pere.

$

Pu�o essere interessante osservare come sia possibile utilizzare gli array nel trat-tamento di �le di testo. A seconda dei casi, e soprattutto in funzione della dimensionedel �le da leggere, pu�o essere opportuno leggere il �le una riga per volta, assegnandola riga letta ad una variabile scalare, ovvero leggere il �le per intero, assegnandoogni riga del �le ad un elemento di un array di stringhe.

#!/usr/local/bin/perl

# leggi.pl

# legge i dati dallo standard input una riga per volta

# e li stampa

$i = 0;

while ($riga = <STDIN>) {

$i++;

print "$i) $riga";

}

#!/usr/local/bin/perl

# leggi_2.pl

# legge i dati dallo standard input per intero

# e poi li stampa

@riga = <STDIN>;

for ($i=0; $i<=$#riga; $i++) {

print "$i) $riga[$i]";

}

Nel primo esempio (leggi.pl) il �le viene letto una riga alla volta ed immediata-mente stampata; viene quindi fatto un uso limitato della memoria della macchina,ma non �e possibile utilizzare in seguito le righe del �le lette ai passi precedenti.Viceversa nel secondo esempio (leggi 2.pl) il �le viene caricato in memoria perintero, assegnando ad ogni componente dell'array @riga una linea del �le di testo;successivamente le linee vengono stampate (facendo uso della struttura di controllofor che introdurremo in seguito). In questo caso il programma pu�o utilizzare inqualsiasi momento ogni linea del �le, senza doverla rileggere; tuttavia se il �le �e digrosse dimensioni, viene fatto un uso pesante della memoria della macchina.

L'espressione \$#riga" fornisce l'indice dell'ultimacomponente dell'array @riga.

3.2 Liste ed array associativi

Una lista in Perl �e semplicemente un insieme ordinato di scalari. Una lista pu�ocontenere numeri, stringhe o anche un misto di entrambi questi tipi di dato. Ine�etti in Perl la di�erenza tra una lista ed un array �e molto sottile, tanto chepotremmo dire che se assegnamo un nome ad una lista ci�o che otteniamo �e un array.Pi�u che altro la distinzione, ben marcata in altri linguaggi di programmazione, inPerl riguarda soprattutto il modo in cui vengono utilizzati certi insiemi di dati.

Una lista viene de�nita elencandone gli elementi, come, ad esempio:

('cani', 'gatti', 'cavalli', 'pesci')

(1, 2, 3, 4, 5, 47, 1.34, 12)

Page 23: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

3.2. LISTE ED ARRAY ASSOCIATIVI 17

Come abbiamo gi�a visto possiamo inizializzare un array con il contenuto di unalista con la seguente istruzione:

@animali = ('cani', 'gatti', 'cavalli', 'pesci');

Gli elementi di una lista possono essere ordinati alfabeticamente utilizzandol'istruzione sort; ad esempio, la seguente istruzione ci permette di ordinare ilcontenuto dell'array @animali appena de�nito:

@animali = sort @animali;

Cogliamo l'occasione per elencare tre importanti istruzioni che consentono die�ettuare delle operazioni elementari sulle liste. L'istruzione shift restituisce ilprimo elemento della lista e lo elimina dalla lista stessa. L'operatore pop restituisceinvece l'ultimo elemento della lista e lo elimina dalla lista. In�ne l'operatore push

inserisce un elemento al termine della lista.Veniamo ora al tipo di dato pi�u importante in Perl, gli array associativi; citando

Larry Wall (l'autore del Perl) si pu�o dire che se non si pensa in termini di arrayassociativi non si sta pensando in Perl.

Un normale array ci permette di \puntare" ai suoi elementi usando numeri intericome indici. Un array associativo ci permette di fare la stessa cosa utilizzandodelle stringhe come indici (o chiavi, in questo caso). Visto che spesso gli ele-menti dell'array sono stringhe, in questo modo possiamo associare tra loro coppiedi stringhe: il dato vero e proprio e la chiave (o l'indice) che lo identi�ca all'internodell'array.

Un array associativo �e una lista di valori come ogni altro array, salvo che peril fatto che invece di indicizzare l'array mediante la posizione di ogni elemento, siindicizza ogni coppia di valori dell'array mediante il primo elemento della coppia.

Ad esempio supponiamo di voler tenere conto del numero di giorni di ognimese dell'anno (supponiamo anche di non essere in un anno bisestile); il seguenteprogrammino potrebbe aiutarci:

#!/usr/local/bin/perl

# giorni.pl: dato il nome di un mese ne stampa il

# numero di giorni

%giorni = ('gennaio', 31, 'febbraio', 28, 'marzo', 31, 'aprile', 30,

'maggio', 31, 'giugno', 30, 'luglio', 31, 'agosto', 31,

'settembre', 30, 'ottobre', 31, 'novembre', 30,

'dicembre', 31);

print "mese: ";

$mese = <STDIN>;

chop($mese);

print "$mese ha $giorni{$mese} giorni.\n";

In maggiore dettaglio possiamo dire che ci si riferisce ad un array associativocon il simbolo \%" (e non con la chiocciola \@", come per i normali array o le liste);il singolo elemento dell'array associativo (che, come al solito �e uno scalare) �e indi-viduato dalla chiave associata; cos�� il terzo elemento dell'array associativo de�nitonell'esempio precedente (31, il numero di giorni del mese di marzo) �e individuatodall'espressione $giornif'marzo'g.

La funzione chop usata dopo aver letto un input da �le, serve ad eliminare ilcarattere di �ne riga dalla variabile che contiene l'input (nel nostro caso la variabile$mese).

Osserviamo in�ne che la funzione keys() restituisce una lista con le chiavidell'array associativo passato come argomento, in modo da consentirci di opera-re sugli elementi dell'array nell'ordine desiderato. La funzione values() e�ettua

Page 24: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

18 CAPITOLO 3. STRUTTURE DATI IN PERL

l'operazione complementare: restituisce una lista con i valori degli elementi dell'arrayassociativo passato come argomento.

3.3 Apici, stringhe ed interpolazione

Il Perl adotta in pieno la convenzione sull'uso degli apici, gi�a adottata da numerosialtri tool in ambiente UNIX, tanto da rendere questa convenzione uno standard perquesto ambiente.

Una coppia di apici singoli \'" (l'apostrofo) viene utilizzata per delimitare unastringa che non dovr�a essere oggetto di ulteriore interpretazione da parte del Perl.Cos��, volendo assegnare alla variabile $nome il valore \Pippo" potremo usare l'e-spressione \$nome = 'Pippo'".

I doppi apici \"" (le virgolette) sono invece utilizzate per delimitare una stringail cui valore dovr�a essere ulteriormente sviluppato dall'interprete Perl. In gergotecnico si dice che l'interprete e�ettuer�a l'interpolazione del valore della stringa, ossiaesploder�a il valore di eventuali variabili o stringhe di controllo contenute all'internodella stringa stessa.

Consideriamo il seguente esempio:

# !/usr/local/bin/perl

# somma.pl: esempio di interpolazione

$a = 3;

$b = 4;

$c = $a+$b;

print 'con apici: $a+$b=$c\n';

print "\ncon virgolette: $a+$b=$c\n";

Eseguendo il programma somma.pl otterremo il seguente output:

$ somma.pl

con apici: $a+$b=$c\n

con virgolette: 3+4=7

$

Nel primo caso, invece di stampare il contenuto delle variabili e di eseguire lastringa di controllo \\n" (ritorno a capo), l'interprete si �e limitato a stampare let-teralmente ci�o che era contenuto tra gli apici. Quando invece sono state utilizzate levirgolette il contenuto della stringa �e stato correttamente sviluppato dall'interprete.

Per rappresentare all'interno di una stringa delimitata da virgolette un carattereche in Perl ha un signi�cato speciale, �e necessario farlo precedere dal simbolo \\"(backslash) per evitare che l'interprete lo utilizzi attribuendogli il signi�cato che hanella sintassi del linguaggio. Ad esempio per visualizzare il simbolo \$" dovremousare la sequenza \\$", e lo stesso faremo per rappresentare simboli particolaricome \"", \%", \@" ed altri ancora; il carattere \\" segue la medesima regola: perrappresentare il backslash sar�a su�ciente ripeterne due di seguito (\\\").

L'apice inverso \`" (accento), presente sulle tastiere americane in alto a sinistra

(codice ASCII 96), ha un signi�cato completamente diverso rispetto agli apici edalle virgolette. Serve infatti a racchiudere un comando che verr�a eseguito aprendoun processo �glio dell'interprete Perl (tipicamente si tratta quindi di comandi dellashell UNIX). L'output prodotto dal comando eseguito mediante l'apice inverso vienerestituito all'interprete Perl (processo padre).

Ad esempio, sappiamo che il comando date della shell UNIX serve a visualizzarela data e l'ora corrente; volendo assegnare questo valore ad una variabile di un nostroscript in Perl possiamo utilizzare la seguente espressione:

Page 25: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

3.4. OPERATORI 19

$data_odierna = `date +%d/%m/%y`;

L'output del comando date viene catturato, senza che venga visualizzato sullostandard output, e restituito come valore di ritorno della chiamata del processostesso.

3.4 Operatori

Il Perl �e un linguaggio in cui, come abbiamo visto, c'�e una certa promisquit�a tra i tipidi dati: non �e necessario stabilire se una determinata variabile conterr�a dati di tiponumerico o stringhe; tuttavia �e ben diverso eseguire una addizione tra numeri o unaconcatenazione di stringhe. A livello di operatori il Perl e�ettua quindi un cast dellevariabili in base al tipo di operazione richiesta. In un certo senso si pu�o dire che,trovandosi di fronte ad un operatore, l'interprete stabilisce il tipo di dato contenutonelle variabili che compaiono nell'espressione da valutare, \in base al contesto".

Se verr�a utilizzato un operatore aritmetico tra due variabili, il Perl tenter�a distabilire il valore numerico delle variabili stesse; viceversa se l'operatore sar�a ditipo stringa allora il Perl tratter�a le variabili coinvolte nell'espressione come dellestringhe.

Nelle tabelle 3.2, 3.3 e 3.4 sono riportati i principali operatori.

$a + $b addizione somma il valore di $a e quello di $b

$a - $b sottrazione sottrae a $a il valore di $b

$a * $b prodotto moltiplica $a e $b

$a / $b divisione divide $a per $b

$a % $b modulo restituisce il resto della divisione $a/$b

$a ** $b esponente restituisce $a elevato a $b

++$a, $a++ incremento aumenta di 1 il valore di $a

--$a, $a-- decremento diminuisce di 1 il valore di $a

Tabella 3.2: Operatori aritmetici

$a . $b concatenazione restituisce una stringa che contiene $a

seguito da $b

$a x $b ripetizione restituisce una stringa che riporta il valore

di $a ripetuto $b volte

substr($a,$n,$l) sottostringa restituisce una sottostringa di $a, a partire

dal carattere $n e lunga $l caratteri

index($a,$b) indice restituisce la posizione del primo carattere

della sottostringa $b all'interno di $a

Tabella 3.3: Operatori stringa

Page 26: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

20 CAPITOLO 3. STRUTTURE DATI IN PERL

$a = $b assegnazione assegna a $a il valore di $b

$a += $b aggiungi a aggiunge al valore di $a il valore di $b

(equivalente a $a = $a+$b)

$a -= $b sottrai a sottrae al valore di $a il valore di $b

(equivalente a $a = $a-$b)

$a .= $b concatena a concatena alla stringa $a la stringa $b

(equivalente a $a = $a.$b)

Tabella 3.4: Operatori di assegnazione

Page 27: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 4

Strutture di controllo

4.1 Operatori logici

Il Perl tratta ogni istruzione come una funzione che quindi restituisce un valore.Ogni valore pu�o essere interpretato in Perl come vero o falso; in generale 0 e lastringa vuota indicano falso, mentre 1 ed una stringa non vuota (e non 0) indicanovero.

Gli operatori logici vengono generalmente usati all'interno di una struttura dicontrollo (come l'istruzione if-else o l'istruzione while che vedremo nelle pagineseguenti) utilizzata per variare il usso del programma, modi�candone la strutturasequenziale. Ci accorgeremo presto che in Perl, sfruttando proprio il fatto che ognioperazione restituisce comunque un valore di vero o falso, si pu�o controllare il ussodel programma anche al di fuori delle tradizionali strutture di controllo.

Vediamo innanzi tutto in quale modo vengono rappresentati in Perl gli operatorilogici. La seguente tabella ne riassume la sintassi:

$a && $b and l'espressione logica �e vera se $a e $b sono

entrambe vere; se $a o $b �e falsa allora

l'espressione �e falsa.

$a || $b or l'espressione logica �e vera se almeno una

delle due variabili �e vera; se $a e $b sono

entrambe false allora l'espressione �e falsa.

!$a not l'espressione logica �e vera se $a �e falsa;

l'espressione �e falsa se $a �e vera.

Tabella 4.1: Operatori logici

4.2 Operatori di Confronto

Il Perl ci mette a disposizione tre insiemi di operatori di confronto; ognuno di questiinsiemi si applica su un tipo di dato di�erente: numeri, stringhe e nomi di �le.

Come per ogni altro operatore il Perl e�ettuer�a un cast (conversione di tipo)delle variabili prima di e�ettuare il confronto per rendere omogeneo e coerente conl'operatore il tipo dei dati trattati.

Le tabelle 4.2, 4.3 e 4.4 riportano i principali operatori:

21

Page 28: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

22 CAPITOLO 4. STRUTTURE DI CONTROLLO

$a == $b uguaglianza vero se $a �e uguale a $b

$a < $b minore di vero se $a �e minore di $b

$a <= $b minore o uguale vero se $a �e minore o uguale a $b

$a > $b maggiore vero se $a �e maggiore di $b

$a >= $b maggiore o uguale vero se $a �e maggiore o uguale a $b

$a != $b diverso vero se $a �e diverso da $b

Tabella 4.2: Operatori di confronto tra numeri

$a eq $b uguaglianza vero se $a �e uguale a $b

$a lt $b minore di vero se $a �e minore di $b (ordine alfabetico

$a le $b minore o uguale vero se $a �e minore o uguale a $b (ordine

alfabetico)

$a gt $b maggiore vero se $a �e maggiore di $b (ordine alfabetico

$a ge $b maggiore o uguale vero se $a �e maggiore o uguale a $b (ordine

alfabetico)

$a ne $b diverso vero se $a �e diverso da $b

Tabella 4.3: Operatori di confronto tra stringhe

4.3 Struttura condizionale if-else

La prima e pi�u elementare struttura di controllo �e la if-else. Permette di modi�-care il usso delle istruzioni del programma a seconda che una certa condizione siao meno veri�cata.

La sintassi dell'istruzione �e la seguente:

if (condizione) f

primo blocco di istruzioni

g else f

secondo blocco di istruzioni

g

Se la condizione �e vera allora viene eseguito il primo blocco di istruzioni racchiusotra parentesi gra�e, altrimenti viene eseguito il secondo blocco di istruzioni. Altermine di ognuno dei due blocchi il usso del programma riprende con le istruzionipresenti dopo la chiusura dell'ultima parentesi gra�a.

Il blocco else pu�o essere omesso:

if (condizione) f

blocco di istruzioni

g

In questo caso se la condizione �e veri�cata allora viene eseguito il blocco di istru-zioni riportato tra parentesi gra�e, quindi l'esecuzione del programma continuer�acon le istruzioni che seguono la parentesi gra�a chiusa; se invece la condizione ri-sulta falsa allora il blocco di istruzioni tra parentesi gra�e non viene eseguito ed ilprogramma continua semplicemente saltando il blocco.

Page 29: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

4.3. STRUTTURA CONDIZIONALE IF-ELSE 23

-r $a leggibile vero se il �le $a �e leggibile

-w $a scrivibile vero se �e possibile scrivere sul �le $a

-d $a directory vero se $a �e una directory

-f $a �le regolare vero se $a �e un �le regolare (non un device o altro)

-T $a �le di testo vero se $a �e un �le di testo

-e $a esiste vero se il �le $a esiste

Tabella 4.4: Operatori su �le

La struttura di controllo if ha alcune interessanti variazioni che rendono in certicasi pi�u sintetico il programma. Ad esempio �e possibile utilizzare la notazione post-

�ssa:

istruzione if condizione;

In questo caso l'istruzione (singola) viene eseguita solo se �e veri�cata la condizione(che con la notazione post-�ssa pu�o non essere racchiusa tra parentesi tonde).

Un altro modo di utilizzare una struttura di controllo simile alla if �e, comeaccennavo precedentemente, quello di sfruttare il fatto che l'esecuzione di ogniistruzione in Perl restituisce un valore che pu�o essere interpretato come vero o falso.

Supponiamo quindi di voler eseguire l'istruzione istruz2 solo se l'istruzione istruz1va a buon �ne (restituisce un valore vero); potremo allora utilizzare l'operatore ande concatenare le due istruzioni con la seguente espressione:

istruz1 && istruz2;

L'espressione appena vista equivale a scrivere

if (istruz1) f

istruz2;

g

Viceversa se si vuole eseguire l'istruzione istruz2 solo se l'istruzione istruz1restituisce un valore falso, potremo utilizzare la seguente espressione:

istruz1 || istruz2;

che equivale alla struttura canonica:

if ( ! istruz1) f

istruz2;

g

Cerchiamo di chiarire meglio questo comportamento assai interessante del Perl,ma piuttosto insolito se confrontato con altri linguaggi di programmazione.

Innanzi tutto negli esempi precedenti abbiamo utilizzato una istruzione al paridi una espressione logica. La di�erenza tra questi due oggetti �e piuttosto marcata:una istruzione serve per compiere una determinata operazione (scrivere qualcosa sulcanale di output, eseguire una operazione matematica, eseguire una operazione suuna stringa di caratteri, ecc.), mentre una espressione logica �e un oggetto che in baseal valore logico (vero o falso) delle sue componenti ci fornisce un valore logico (vero

Page 30: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

24 CAPITOLO 4. STRUTTURE DI CONTROLLO

o falso). In Perl per�o le due cose si confondono visto che ogni istruzione restituiscecomunque un valore che pu�o essere interpretato in termini logici, ossia in termini di\vero o falso".

Quindi non �e sbagliato utilizzare una istruzione come operatore logico che cipremette di compiere una decisione.

In secondo luogo �e importante capire il modo in cui il Perl valuta le espressionilogiche. Come per ogni espressione si parte da sinistra e si procede verso destranella valutazione delle componenti; le parentesi servono a stabilire priorit�a diverseda quelle standard. Inoltre, per ottimizzare i tempi di esecuzione, il Perl interrompela valutazione di una espressione logica non appena �e in grado di stabilirne il valoredi vero o falso.

Quindi nel caso di una espressione del tipo \A and B" (in Perl scriveremo \A &&

B") se dopo aver valutato l'espressione logica A si ottiene un valore falso, allora ilPerl non valuter�a l'espressione B, visto che questa operazione risulterebbe comunqueinutile al �ne della valutazione dell'espressione \A and B" (l'operatore logico andrestituisce vero se e solo se entrambi i termini sono veri). L'espressione B verr�aquindi valutata solo se l'espressione A risulta vera.

Viceversa nella valutazione dell'espressione logica \A or B" se il termine Arisulta vero allora il Perl non valuter�a il termine B, visto che comunque basta cheuno dei due termini sia vero per stabilire il valore (vero) dell'intera espressione. Seil termine A risulta falso allora il Perl non essendo ancora in grado di stabilire ilvalore dell'intera espressione \A or B" e quindi proceder�a alla valutazione anchedel secondo termine.

4.4 Il ciclo while

In Perl esistono sostanzialmente due strutture di controllo per realizzare cicli itera-tivi: la struttura while e la struttura for.

La struttura while ci permette di ripetere un certo blocco di istruzioni �nch�el'espressione logica che controlla il ciclo risulta vera. Quando dovesse risultare falsail usso del programma uscirebbe fuori dal ciclo. Se l'espressione �e falsa gi�a prima

di entrare nel ciclo while allora questo non verr�a eseguito neanche una volta. Lasintassi �e la seguente:

while (espressione) f

blocco di istruzioni

g

Vediamo tre esempi di come pu�o essere utilizzata la struttura iterativa while. Ilprimo �e il pi�u semplice: il ciclo viene ripetuto �no a quando la variabile ag $n nonassume il valore zero.

#!/usr/local/bin/perl

$n=10;

while ($n > 0) {

$n--;

print "$n ";

}

Il secondo esempio legge e stampa il contenuto di un �le:

#!/usr/local/bin/perl

open(IN, "< /tmp/dati") || die "Impossibile aprire il file\n\n";

while ($r = <IN>) {

Page 31: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

4.5. IL CICLO FOR 25

print $r;

}

close(IN);

In�ne il terzo esempio visualizza il contenuto di una lista:

#!/usr/local/bin/perl

@frutta = ("mele", "pere", "pesche", "albicocche");

while (@frutta) {

$frutto = shift @frutta;

print "$frutto\n";

}

4.5 Il ciclo for

La struttura for consente di ripetere un numero pre�ssato di volte un certo bloccodi istruzioni, controllando la ripetizione del ciclo mediante un contatore. La sintassidell'istruzione for �e la seguente:

for (condizione iniziale; condizione �nale; incremento) f

blocco di istruzioni

g

Nell'esempio seguente viene utilizzato un ciclo for per stampare tutti gli elementidi un array.

#!/usr/local/bin/perl

@frutta = ("mele", "pere", "pesche", "albicocche");

for ($i=0; $i<=$#frutta; $i++) {

print "$frutta[$i]\n";

}

La variabile contatore $i assume inizialmente il valore 0, viene incrementata adogni ciclo di 1, �no a quando non raggiunge il valore pari al numero di elementi

dell'array @frutta (ricordiamo che questo numero �e espresso da $#frutta).

Una struttura di controllo per iterare un blocco di istruzioni, simile alla for, �ela foreach, che consente di inserire in una variabile scalare uno dopo l'altro tuttigli elementi di una lista. Il seguente esempio, del tutto equivalente al precedente, cisar�a di aiuto per comprendere il funzionamento di questa istruzione:

#!/usr/local/bin/perl

@frutta = ("mele", "pere", "pesche", "albicocche");

foreach $frutto (@frutta) {

print "$frutto\n";

}

Ad ogni iterazione del ciclo la variabile scalare $frutto assume un valore pari aquello dell'elemento \corrente" della lista @frutta.

4.6 Altre istruzioni di controllo

Chiudiamo questo capitolo riportando altre due istruzioni che possono risultare utilise utilizzate in modo oculato all'interno di un cliclo.

Page 32: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

26 CAPITOLO 4. STRUTTURE DI CONTROLLO

L'istruzione next forza il Perl a saltare alla successiva iterazione del ciclo, senzaeseguire le rimanenti istruzioni del blocco.

L'istruzione last invece termina l'esecuzione di un ciclo facendo saltare il ussodel programma alla prima istruzione successiva al ciclo stesso.

Vediamo con un esempio un possibile utilizzo di queste due potenti istruzioni.Supponiamo di voler leggere il contenuto di un �le e di volerne stampare solo leprime 20 linee saltando per�o tutte le linee vuote. Le linee stampate dovranno ancheessere numerate. Il programma potrebbe essere il seguente:

#!/usr/local/bin/perl

$cont = 0;

open (IN, "< /tmp/data") || die "Impossibile aprire il file\n\n";

while ($riga = <IN>) {

chop($riga);

$riga || next;

$cont++;

print "$cont) $riga\n";

($cont == 20) && last;

}

close(IN);

Page 33: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 5

Pattern matching

Una delle caratteristiche principali del Perl �e sicuramente quella di poter operarein modo estremamente essibile sulle stringhe di caratteri. Il concetto che sta allabase di questa funzionalit�a �e la possibilit�a di descrivere in modo generico un certopattern, ossia uno schema di costruzione di una stringa, per poter e�ettuare deiconfronti o delle sostituzioni all'interno di altre stringhe.

Ci�o che ci permette di fare la maggior parte dei linguaggi di programmazione�e di veri�care che una certa sottostringa sia contenuta in una stringa pi�u lunga.Il Perl, come vedremo nelle prossime pagine, ci consente di generalizzare questaoperazione ricercando all'interno di una stringa non una sottostringa ben precisa,ma una generica sottostringa la cui struttura viene descritta utilizzando una certa

sintassi (espressioni regolari). In altri termini possiamo dire che l'operazione dipattern matching ci permette di veri�care se una stringa appartiene o meno ad uninsieme di stringhe, descritto mediante una espressione regolare.

5.1 Espressioni regolari

In questo contesto parlando di espressioni regolari intenderemo una espressionecostruita secondo una sintassi ben precisa che ci permette di descrivere uno schemadi stringa.

Senza entrare in ulteriori dettagli cerchiamo di capire questo concetto medianteun esempio elementare. Supponiamo di voler \descrivere" tutte le stringhe compostesecondo il seguente schema: un numero con un qualsiasi numero di cifre, un carattere

di spaziatura o tabulazione ed una parola composta da caratteri qualsiasi. Con unaespressione regolare diventa banale descrivere questa \ricetta" di composizione diuna stringa:

\d+\s.+

I primi due caratteri \\d" indicano la presenza di un carattere numerico (0, 1, 2, ...,9); il carattere \+" che segue una certa sequenza indica che il carattere rappresentatopu�o essere ripetuto una o pi�u volte. La sequenza \\s" indica un qualsiasi caratteredi spaziatura o di tabulazione. In�ne il punto \." indica un carattere qualsiasi e ilsimbolo \+" �nale sta ad indicare che questo carattere pu�o essere ripetuto una o pi�uvolte.

Questa espressione regolare descriver�a quindi stringhe del tipo \1234 pippo",\1 ab$%&xy", \1 2". Le seguenti stringhe invece non risultano \descritte" dallaprecedente espressione regolare: \a b", \pippo", \albero casa", \1+3=4".

La seguente tabella descrive sinteticamente i termini che possono comporre unaepressione regolare:

27

Page 34: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

28 CAPITOLO 5. PATTERN MATCHING

. qualsiasi carattere escluso il new line (\\n")

[a-z0-9] qualsiasi carattere di questo insieme

[^a-z0-9] qualsiasi carattere esclusi quelli di questo insieme

\d una cifra qualsiasi; equivalente a \[0-9]"

\D un carattere che non sia una cifra; equivalente a \[\^0-9]"

\w un carattere alfanumerico; equivalente a \[a-zA-Z0-9]"

\W un carattere non alfanumerico; equivalente a \[\^a-zA-Z0-9]"

\s un carattere di spaziatura (spazio, tabulazione, new line, ecc.)

\S un carattere non di spaziatura

\n il carattere new line

\r il carattere return (ritorno carrello)

\t il carattere di tabulazione

\f form feed, carattere di avanzamento di pagina

\b backspace, cancellazione di un carattere a sinistra

\0 null, il carattere nullo

\| il carattere \|"

\\ il carattere \\"

\* il carattere \*"

x? il carattere x ripetuto 0 o 1 volta

x* il carattere x ripetuto 0 o pi�u volte

x+ il carattere x ripetuto una o pi�u volte

pippo la stringa \pippo"

aa|bb|cc la stringa \aa" oppure la stringa \bb" oppure la stringa \cc"

^ la stringa inizia con l'espressione regolare seguente

$ la stringa termina con l'espressione regolare precedente

Tabella 5.1: Termini per la composizione di una espressione regolare

5.2 Pattern matching

Con il termine pattern matching si intende l'operazione di veri�ca se una certa stringao una sua sottostringa corrisponde ad un certo pattern, ossia se �e costruita secondoun determinato schema.

In Perl l'operatore che consente di e�ettuare il pattern matching �e indicato da\m/espressione regolare/"; in e�etti la lettera \m" (match) che precede la coppia dislash (\/") pu�o essere omessa.

Per veri�care se la stringa contenuta nella variabile $a (o una sua sottostringa)corrisponde al pattern descritto da una certa espressione regolare si utilizzer�a laseguente istruzione, che restituisce naturalmente il valore \vero" se il matching ri-esce e \falso" altrimenti:

$a =~ /espressione regolare/

Supponiamo quindi di voler leggere dal canale di input standard una stringaimmessa dall'utente e di voler veri�care se la stringa �e strutturata in un certo modo(ad esempio un numero, seguito da uno spazio e quindi da una stringa qualsiasi); ilprogramma potrebbe essere il seguente:

#!/usr/local/bin/perl

print "Inserisci una stringa: ";

$a = <STDIN>;

Page 35: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

5.3. PATTERN SUBSTITUTION 29

if ($a =~ /^\d+\s.+/) {

print "Ok, il formato della stringa e' corretto\n";

} else {

print "Il formato non e' quello desiderato\n";

}

Supponiamo ora di voler stampare tutte le righe di un certo �le che contengonouna stringa inserita dall'utente. Un possibile programma per la soluzione di questosemplice problema �e il seguente:

#!/usr/local/bin/perl

print "Nome del file: ";

$file = <STDIN>;

chop($file);

-e $file || die "Il file non esiste!\n\n";

-T $file || die "Il file non e' un file di testo!\n\n";

print "Stringa da cercare: ";

$stringa = <STDIN>;

chop($stringa);

open (IN, "< $file") || die "impossibile aprire $file.\n\n";

while ($r = <IN>) {

$r =~ /$stringa/ && print $r;

}

close(IN);

Nell'e�ettuare ilmatching di una espressione �e possibile tenere memoria di alcunecomponenti dell'espressione stessa. In un'espressione regolare, ogni termine racchiu-so tra parentesi tonde verr�a memorizzato e ci si potr�a riferire ad esso all'interno dellastessa espressione mediante la sequenza \\n", dove n �e il numero progressivo deltermine memorizzato.

Ad esempio la seguente espressione regolare \descrive" tutte le stringhe del tipo\x = x":

/^(.+)=\1$/

Infatti l'espressione indica che la stringa deve iniziare (\^") con una certa stringanon nulla (\(.+)") che viene memorizzata in \\1", quindi deve essere presente ilsimbolo di uguaglianza (\="), e deve terminare (\$") con una stringa identica allaprecedente (\\1").

Nelle istruzioni successive ad un pattern matching ci si potr�a riferire alle variabili\\n" mediante le variabili "speciali" $n.

5.3 Pattern substitution

L'operazione di pattern substitution consente di cercare una certa sottostringa all'in-terno di una stringa (e�ettuando il pattern matching con una espressione regolare)e di sostituire a questa sottostringa un altro insieme di caratteri. L'operatore che

consente di e�ettuare questa operazione ha la seguente sintassi:

s/pattern di ricerca/pattern di sostituzione/

La sostituzione del primo pattern con il secondo viene e�ettuata una sola volta

(sulla prima occorrenza del primo pattern) a meno che dopo il terzo slash non siaggiunga il carattere \g" (globally) che indica di ripetere la sostituzione su tutte leoccorrenze del pattern di ricerca e non solo sulla prima.

Page 36: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

30 CAPITOLO 5. PATTERN MATCHING

Modi�chiamo l'esempio precedente per produrre un semplice programmino checerca una certa stringa all'interno di un �le di input e genera un �le di output incui ogni occorrenza della stringa �e stata sostituita da una seconda stringa inseritadall'utente.

#!/usr/local/bin/perl

print "Nome del file di input: ";

$file = <STDIN>;

chop($file);

-e $file || die "Il file non esiste!\n\n";

-T $file || die "Il file non e' un file di testo!\n\n";

print "Stringa da cercare: ";

$stringa = <STDIN>;

chop($stringa);

print "Stringa da sostituire: ";

$sost = <STDIN>;

chop($sost);

open (IN, "< $file") || die "Impossibile aprire $file.\n\n";

open (OUT, "> $file.new") || die "Impossibile creare $file.new\n\n";

while ($r = <IN>) {

$r =~ s/$stringa/$sost/g;

print OUT $r;

}

close(IN);

close(OUT);

Page 37: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 6

Variabili speciali

Il Perl ci mette a disposizione un insieme piuttosto ricco di variabili speciali, ossia divariabili gestite direttamente dall'interprete che contengono parametri spesso assaiutili.

6.1 Argomenti su riga di comando e variabili di

ambiente

In molti casi pu�o essere utile passare dei parametri sulla linea di comando al nostroscript Perl. I parametri vengono immagazzinati automaticamente nell'array @ARGV:come per ogni altro array $#ARGV indica l'indice dell'ultimo elemento dell'array.

Supponiamo ad esempio di voler scrivere una versione molto sempli�cata delcomando grep di UNIX. Ci�o che vogliamo realizzare �e uno script che stampi inoutput le righe dei �le di testo della directory corrente che contengono la stringapassata come argomento al programma stesso. Quella che segue �e una delle possibiliimplementazioni di questo programma:

#!/usr/local/bin/perl

# grep.pl: versione semplificata di grep

$ARGV[0] || die "Non e' stato specificata la stringa da cercare\n\n";

@file = `ls -1`;

chop(@file);

foreach $file (@file) {

-T $file || next;

open(IN, "< $file") || next;

while ($r = <IN>) {

$r =~ /$ARGV[0]/ && print "$file: $r";

}

close(IN);

}

L'esempio precedente �e sicuramente sovradimensionato per illustrare l'uso dell'ar-ray @ARGV, ma pu�o essere utile per richiamare vari concetti visti in precedenza.

Un altro dato che spesso pu�o risultare assai utile �e costituito dalle variabili

di ambiente, ossia quelle variabili impostate a livello di shell che possono essereutilizzate anche all'interno del programma Perl che le \eredita". Le variabili di

ambiente sono memorizzate dall'interprete nell'array associativo %ENV; la chiave perindicizzare gli elementi dell'array �e il nome della variabile stessa. Ad esempio lavariabile $ENVftermg contiene il tipo di terminale utilizzato dall'utente; la variabile

31

Page 38: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

32 CAPITOLO 6. VARIABILI SPECIALI

$ENVfpathg contiene il path di ricerca delle applicazioni sul sistema dell'utente.Chiaramente impostando un valore nell'array associativo %ENV si imposter�a unavariabile d'ambiente ereditata anche dai processi richiamati dallo script Perl.

6.2 Variabili speciali sul pattern matching

In seguito ad un pattern matching vengono istanziate le seguenti variabili speciali:

$1, $2,... Contengono i pattern contenuti nelle parentesi del pattern matching

(corrispondono ai pattern a cui ci si riferisce con \1, ..., \9 all'interno

del pattern matching).

$& La stringa che ha veri�cato l'ultimo pattern matching.

$` La stringa che precede quella che ha veri�cato l'ultimo pattern matching.

$' La stringa che segue quella che ha veri�cato l'ultimo pattern matching.

$+ L'ultima parentesi del pattern matching.

Tabella 6.1: Variabili speciali per il pattern matching

6.3 Variabili speciali e �le

Le seguenti variabili speciali hanno a che fare con le operazioni di I/O su �le:

$ La variabile di default per le operazioni di input e di pattern matching.

$. La linea corrente del �le di input.

$/ Il separatore di record (di default $/ = "\n"); pu�o essere impostata ad

una qualsiasi sequenza di separazione dell'input letto da �le.

Tabella 6.2: Variabili speciali per l'uso di �le

6.4 Variabili speciali e processi

In�ne le seguenti variabili speciali possono essere utili nel controllare i processi edi sottoprocessi attraverso uno script Perl:

$$ Il numero di processo dello script in esecuzione.

$? Lo stato di ritorno dell'ultima operazione di esecuzione di un processo esterno

$0 Il nome del �le contenente lo script in Perl.

$! L'ultimo codice di errore generato dallo script.

$@ L'ultimo messaggio di errore prodotto dallo script.

$< Lo user ID reale del processo.

$> Lo user ID e�ettivo del processo.

Tabella 6.3: Variabili speciali e processi

Page 39: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 7

Subroutine

In questo breve capitolo descriveremo tutte quelle tecniche che possono servire arendere pi�u modulare uno script, in modo da poterne riutilizzare in pi�u contestialcune sue parti o anche per poter integrare nello script strumenti software gi�aesistenti e che sarebbe dispendioso riscrivere da capo.

7.1 Subroutine

Se una certa parte di codice deve essere richiamata pi�u volte all'interno di uno scripto semplicemente per motivi di leggibilit�a del codice stesso, pu�o essere utile spezzareun lungo script in pi�u subroutine, ossia piccoli pezzi di sottoprogramma con una loropropria identit�a logica e funzionale. In Perl chiameremo quindi subroutine ci�o chein Pascal viene chiamato procedura ed in C funzione.

Una subroutine deve essere de�nita prima di poterla utilizzare; per far questo siusa il seguente costrutto:

sub nome subroutine f

blocco di istruzioni della subroutine

return valore di ritorno;

g

�E possibile passare dei parametri alla subroutine, che verranno memorizzatidall'interprete nell'array \@ ". La subroutine pu�o a sua volta restituire un valoreche deve essere speci�cato come argomento della funzione return.

Per richiamare una subroutine de�nita nello script si deve speci�care il nome pre-ceduto dal simbolo \&" e seguito dalle parentesi che possono eventualmente contenerei parametri (separati da virgole) passati alla subroutine.

Con la funzione local possono essere de�nite delle variabili locali che hannovalidit�a solo all'interno della subroutine.

Nell'esempio seguente viene de�nita una subroutine \media" che restituisce lamedia aritmetica dei numeri passati come argomento:

#!/usr/local/bin/perl

# media.pl

# legge dei valori in input e ne stampa la

# media aritmetica

sub media {

local($n, $somma, $media);

foreach $n (@_) {

33

Page 40: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

34 CAPITOLO 7. SUBROUTINE

$somma += $n;

}

$media = $somma/($#_+1);

return($media);

}

print "Inserisci i numeri:\n";

@numeri = <STDIN>;

chop(@numeri);

$media = &media(@numeri);

print "media = $media\n";

7.2 Ricorsione

In Perl possono anche essere de�nite delle funzioni ricosive, ossia delle funzioni chepossono richiamare se stesse per produrre il risultato desiderato.

Ad esempio supponiamo di voler calcolare il fattoriale di un numero intero; ilfattoriale di n �e quella funzione che restituisce il prodotto dei numeri da 2 ad n.Possiamo de�nire due subroutine diverse per calcolare il fattoriale di n, una iterativaed una ricorsiva:

#!/usr/local/bin/perl

# fattoriale.pl

sub fattoriale_1 {

local($i, $n, $f);

$n = shift(@_);

$f = $n;

for ($i=$n -1; $i>1; $i--) {

$f = $f*$i;

}

return($f);

}

sub fattoriale_2 {

local($n) = shift(@_);

($n == 1) && return(1);

return($n * &fattoriale_2($n-1));

}

$n = <STDIN>;

$f1 = &fattoriale_1($n);

$f2 = &fattoriale_2($n);

print "fattoriale iterativo = $f1\n";

print "fattoriale ricorsivo = $f2\n";

7.3 Programmi esterni

Con il Perl esistono vari modi per integrare tra loro pi�u programmi esterni, ri-chiamandoli in modo opportuno da uno script in modo che cooperino per la soluzionedel problema posto. Brian W. Kernighan1 nella prefazione di un suo famoso volume,

1B. W. Kernighan, R. Pike, UNIX, Zanichelli, Bologna, 1995.

Page 41: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

7.3. PROGRAMMI ESTERNI 35

nel sostenere che UNIX �e un sistema operativo assai potente ed e�cace, asserisceche il punto centrale �e costituito dal concetto che la forza di un sistema nascepi�u dall'interazione tra i programmi che non dai programmi veri e propri. Sepresi isolatamente|sostiene Kernighan|molti programmi UNIX compiono dei la-vori banali, ma combinati con altri, diventano strumenti utilissimi e generalizzati. IlPerl consente di realizzare questa integrazione in modo assai versatile ed e�ciente.

I modi usati pi�u comunemente per interagire con programmi esterni attraversouno script in Perl sono sostanzialmente tre:

� mediante gli apici inversi;

� mediante la funzione system o la funzione exec;

� mediante l'apertura di un canale di pipe.

Vediamo in estrema sintesi queste tre tecniche.

7.3.1 Chiamata mediante apici inversi

�E il modo pi�u semplice e diretto di richiamare un programma esterno. Sostan-zialmente in questo modo si lancia un processo �glio che esegue il suo compito erestituisce l'output come valore di ritorno, senza visualizzare nulla sullo STDOUT.

Ad esempio per inserire la data corrente nella variabile $data si pu�o utilizzarela seguente chiamata:

$data= `date +%d/%m/%y`;

Chiaramente si possono eseguire operazioni anche molto pi�u complesse di questa,magari concatenando in un pipe pi�u chimate. Ad esempio per leggere un �le di input($file) ordinandone le righe e selezionando solo quelle che contengono la stringa$s si pu�o usare la seguente espressione:

@linee = `cat $file | grep $s | sort`

7.3.2 Le funzioni system ed exec

Queste due funzioni aprono un processo �glio e lo eseguono interamente (senzaintercettarne l'output come per l'esecuzione di programmimediante gli apici inversi).

Se l'esecuzione di un programma esterno viene e�ettuata mediante la funzionesystem, allora lo script aspetter�a che il programma esterno sia completamenteterminato prima di riprendere l'esecuzione dall'istruzione successiva alla system.

Con la chiamata exec invece lo script termina l'esecuzione e passa de�nitiva-mente il controllo al programma esterno richiamato.

7.3.3 Esecuzione mediante il canale di pipe

Aprendo un programma esterno come se fosse un �le in modalit�a di \piping", se nepossono sfruttare le funzionalit�a da uno script in Perl.

Ad esempio, supponiamo di voler visualizzare il contenuto di un array, impa-ginando l'output mediante il comando UNIX more. Il seguente frammento di scriptfornisce una possibile implementazione:

open (OUT, "| more") || die "Errore\n\n";

foreach $riga (@array) {

print OUT $riga;

}

close(OUT);

Page 42: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

36 CAPITOLO 7. SUBROUTINE

Un esempio un po' pi�u so�sticato �e il seguente. Supponiamo di voler inviare perposta elettronica ad un certo indirizzo l'output del nostro script; il seguente fram-mento di codice suggerisce una possibile implementazione (in questo caso sfrutteremoil comando mail disponibile su numerosi sistemi UNIX):

$indirizzo = '[email protected]';

open (MAIL, "| /bin/mail $indirizzo") || die "Impossibile inviare

il messaggio all'indirizzo $indirizzo.\n\n";

print MAIL <<"END";

Subject: Risultato dello script

Lo script ha prodotto il seguente risultato...

END

close(MAIL);

7.4 Librerie esterne

Un'altra tecnica per rendere modulare e riutilizzabile il codice delle nostre subroutine�e quello di produrre una libreria di subroutine di uso comune e salvarle su uno o pi�u�le. Successivamente se avremo bisogno di utilizzare una subroutine gi�a de�nita suun �le esterno, potremo includere tale �le nel nostro script utilizzando la funzionerequire.

Alla funzione require deve essere passato come parametro il nome del �le chesi vuole includere nello script. Il parametro deve quindi includere il path asso-

luto del �le desiderato, a meno che il �le non si trovi in una delle directory didefault in cui l'interprete Perl va a cercare le librerie di subroutine da includerenegli script. Questo path di ricerca �e contenuto nell'array @INC; se si vuole inseri-re un'altra directory nell'array baster�a aggiungerla alla lista con la funzione push.Il path di ricerca di default dipende dall'installazione dell'interprete Perl di cui sidispone sul proprio sistema (tipicamente su un sistema UNIX esiste una directory/usr/local/lib/perl).

7.5 Valutazione di espressioni

Concludendo questo capitolo �e opportuno citare anche la funzione eval, che con-sente di valutare espressioni Perl. Questa funzione, che appare subito estremamentepotente, pu�o risultare spesso di�cilmente utilizzabile, ma in alcuni casi pu�o inveceessere determinante per sbrogliare situazioni intricate e di di�cile soluzione.

In alcuni contesti pu�o risultare troppo gravoso scrivere a priori delle subroutineper svolgere determinati compiti, oppure una subroutine molto generale pu�o risultarepoi di fatto troppo lenta; in questi casi pu�o invece essere utile produrre runtime (almomento dell'esecuzione dello script) delle subroutine sulla base del contesto in cuici si trova e farle quindi eseguire all'interprete mediante la funzione eval.

Riportiamo un esempio elementare che pu�o aiutare a chiarire il funzionamentodi questa potente istruzione. Riprendiamo quindi lo script per il calcolo della mediaaritmetica su un insieme di numeri inseriti dall'utente e riscriviamolo sfruttando lafunzione eval:

#!/usr/local/bin/perl

# media_bis.pl

# legge dei valori in input e ne stampa la media aritmetica

sub media {

local($n, $somma, $media);

Page 43: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

7.5. VALUTAZIONE DI ESPRESSIONI 37

$media = "(";

$media .= join('+', @_);

$media .= ")/($#_+1)";

return(eval($media));

}

print "Inserisci i numeri:\n";

@numeri = <STDIN>;

chop(@numeri);

$media = &media(@numeri);

print "media = \$media/n";

Page 44: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

38 CAPITOLO 7. SUBROUTINE

Page 45: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Capitolo 8

Funzioni principali

Riportiamo in quest'ultimo capitolo una descrizione sintetica (quasi un elenco) dellefunzioni di uso comune. Per una lista completa ed una descrizione esaustiva dellefunzioni di libreria si rimanda alla documentazione sul linguaggioPerl presente anchenella breve bibliogra�a riportata nell'introduzione.

8.1 Funzioni aritmetiche

abs(espr) valore assoluto dell'espressione

cos(espr) coseno trigonometrico dell'espressione

exp(espr) esponenziale (e elevato a espr)

int(espr) valore intero

log(espr) logaritmo naturale (in base e) di espr

rand(espr) valore casuale (non intero) tra 0 ed espr

sin(espr) seno trigonometrico di espr

sqrt(espr) radice quadrata di espr

8.2 Funzioni di conversione

chr(espr) restituisce il carattere rappresentato dal valore decimale espr

hex(espr) valore decimale del numero esadecimale espr

oct(espr) valore decimale del numero ottale espr

ord(espr) codice ASCII del primo carattere di espr

8.3 Funzioni su stringhe

chop(lista) rimuove l'ultimo carattere da ogni elemento della lista

eval(espr) valuta l'espressione Perl espr

index(str, substr) posizione di substr all'interno della stringa str

length(espr) lunghezza della stringa espr

39

Page 46: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

40 CAPITOLO 8. FUNZIONI PRINCIPALI

lc(espr) restituisce espr in caratteri minuscoli

rindex(str,substr) posizione dell'ultima occorrenza di substr nella stringa str

substr(espr,o�set,len) estrae una sottostringa di lunghezza len dalla stringa espr

a partire dal carattere di posizione o�set

uc(espr) restituisce espr in caratteri maiuscoli

8.4 Funzioni su array e liste

delete($arrayfchiaveg) elimina l'elemento dall'array associativo

exists($arrayfchiaveg) veri�ca se l'elemento dell'array associativo esiste

grep(espr,lista) restituisce gli elementi della lista per i quali l'espressione espr havalore vero

join(espr,lista) concatena gli elementi della lista separandoli mediante la stringaespr; restituisce una stringa con gli elementi concatenati

keys(%array) restituisce una lista con le chiavi dell'array associativo

pop(@array) restituisce l'ultimo elemento dell'array e lo elimina dall'array stesso

push(@array,lista) inserisce gli elementi della lista alla �ne dell'array

reverse(lista) restituisce la lista in ordine inverso

shift(@array) restituisce il primo elemento della lista e lo elimina dall'array

sort(lista) ordina gli elementi della lista e restituisce una lista ordinata

splice(@array,o�set,length,lista) rimuove gli elementi dell'array a partire da o�-

set per length elementi e li rimpiazza con gli elementi della lista; restituisce glielementi rimossi

split(pattern,espr) restituisce una lista di elementi generati dividendo la stringaespr in elementi ogni volta che viene incontrata la sottostringa pattern

unshift(@array,lista) inserisce gli elementi della lista in testa all'array

values(%array) restituisce un array con i valori degli elementi dell'array associativo

8.5 Funzioni su �le e directory

chmod(modo,lista) cambia i permessi sui �le speci�cati nella lista

chown(user,group,lista) cambia il proprietario ed il gruppo dei �le speci�cati nellalista

mkdir(dir,modo) crea la directory dir con i permessi speci�cati in modo

truncate(�le,dim) tronca il �le alla dimensione dim

rename(vecchio,nuovo) cambia il nome di un �le

rmdir(dir) elimina la directory dir

unlink(lista) cancella dal �lesystem i �le speci�cati nella lista

Page 47: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

8.6. FUNZIONI DI INPUT/OUTPUT 41

8.6 Funzioni di Input/Output

close(�lehandle) chiude il �le

eof(�lehandle) restituisce vero se il �le �e terminato, falso altrimenti

getc(�lehandle) restituisce il successivo carattere letto dal �le

open(�lehandle,�le) apre il �le e gli associa il nome logico �lehandle

print �lehandle lista scrive su �le

read(�lehandle, $var,n,o�set) legge n byte dal �le a partire dalla posizione o�sete li memorizza in $var

seek(�lehandle,posizione) posiziona il puntatore all'interno del �le

sprintf formato,lista restituisce lista in una stringa formattata in base al formato

tell(�lehandle) restituisce la posizione del puntatore all'interno del �le

Page 48: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

42 CAPITOLO 8. FUNZIONI PRINCIPALI

Page 49: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

Indice analitico

abs, 39accento, 18algoritmo, 2, 3and, 21, 23, 24apici, 18apostrofo, 18array, 6, 15array associativi, 17

bit, 6byte, 6

cancelletto, 11cast, 19, 21CGI, 9chiavi, 17chmod, 10, 40chop, 17, 39chown, 40chr, 39close, 41commento, 11compilatore, 2, 5computer, 1cos, 39

date, 18delete, 40diagrammi di usso, 3

else, 22eof, 41espressione regolare, 27, 29eval, 36, 39exec, 35exists, 40exp, 39

�le, 7, 11, 12, 16�le handler, 12for, 16, 24, 25foreach, 25

getc, 41grafo, 7grep, 31, 40

handler, 8, 11hex, 39

if, 22, 23index, 19, 39int, 39interpolazione, 18interprete, 5, 9, 10

join, 40

keys, 17, 40

last, 26lc, 40length, 39libreria, 36linguaggio di programmazione, 2, 4linguaggio macchina, 2, 4lista, 7, 16local, 33locazioni di memoria, 5log, 39

mail, 36matrice, 6memoria RAM, 6mkdir, 40

newline, 10next, 26not, 21

oct, 39open, 41operatori di confronto, 21operatori logici, 21or, 21, 24ord, 39

parametri, 33pattern matching, 9, 27{29, 32pattern substitution, 9, 29

pipe, 35pop, 17, 40print, 10, 41

43

Page 50: In - Roma TreIn tro d uzion e Il lin guaggio P erl eu no stru m en t o formid a bile: al t emp o st e sso u npo' m agico e d e strem am en t e elegan e, p ot eecompa o. Sup era eleprim

44 INDICE ANALITICO

programma, 1programmazione strutturata, 3puntatori, 6push, 17, 36, 40

rand, 39read, 41redirezione, 11rename, 40require, 36return, 33reverse, 40ricorsione, 34rindex, 40rmdir, 40

seek, 41shift, 17, 40sin, 39sort, 17, 40splice, 40split, 40

sprintf, 41sqrt, 39standard error, 12standard input, 11, 12standard output, 11, 12STDERR, 12STDIN, 11, 12STDOUT, 12subroutine, 33subroutine ricorsive, 34substr, 19, 40system, 35

tell, 41tipi di dato, 6traduttori, 5truncate, 40

uc, 40unlink, 40unshift, 40

values, 17, 40variabili, 5, 15variabili di ambiente, 31variabili locali, 33variabili scalari, 10, 15variabili speciali, 31, 32variabili vettoriali, 15vettore, 6, 15virgolette, 18

while, 12, 24