21.01.2015 Views

Introduzione a Perl

Introduzione a Perl

Introduzione a Perl

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong> a <strong>Perl</strong><br />

Gianluca Della Vedova<br />

Univ. Milano-Bicocca<br />

http://www.statistica.unimib.it/utenti/dellavedova<br />

<strong>Perl</strong> è:<br />

un linguaggio interpretato<br />

un linguaggio strutturato con estensioni ad oggetti<br />

in grado di gestire nativamente sequenze di caratteri<br />

(stringhe)<br />

Schema di programma<br />

Schema di programma<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Ogni programma perl inizia con la riga<br />

Ogni programma perl inizia con la riga<br />

#!/usr/bin/perl<br />

Anche se è preferibile usare<br />

#!/usr/bin/perl<br />

#!/usr/bin/perl -w<br />

al fine di visualizzare tutti i warning.<br />

Sintassi<br />

Librerie<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Ogni istruzione viene terminata con ;<br />

Un blocco di istruzioni è una sequenza di istruzioni<br />

racchiusa fra parentesi graffe {}.<br />

Un blocco di istruzioni è logicamente equivalente ad una<br />

singola istruzione.<br />

Il cancelletto inizia un commento che termina a fine riga<br />

# questo è un commento<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Le librerie vengono incluse con il comando use<br />

use Getopt::Long;<br />

Il comando use serve ad invocare delle direttive<br />

use strict;<br />

Condizioni<br />

Assegnamenti<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gli operatori di confronto fra interi sono i seguenti:<br />

== < > >=


Liste<br />

Variabili e tipi<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

Una lista è una sequenza di variabili scalari, identificate con<br />

un indice (numero intero).<br />

@lista<br />

@lista=(4,6);<br />

$lista[0]=4;$lista[1]=6;<br />

@lista=qw(4 6);<br />

La variabile di default è $_<br />

Il tipo di una variabile non viene dichiarato.<br />

Una variabile può essere di tipo intero (int), virgola mobile<br />

(float) o stringa (string).<br />

Una costante stringa viene racchiusa da apici<br />

$a=’frase di quattro parole’<br />

File<br />

Scrittura su file<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

Alcuni file sono disponibili in ogni programma <strong>Perl</strong>:<br />

standard input STDIN<br />

standard output STDOUT<br />

standard error STDERR<br />

Per scrivere su file la sintassi è’:<br />

print FILE scrivo questo;<br />

Se si omette il file si scrive su standard output, quindi...<br />

print scrivo questo’’ stampa su schermo<br />

Lettura da file<br />

Incrementi<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

I file vengono letti una riga alla volta<br />

Per leggere una riga di un file la sintassi è’: $a=;<br />

L’istruzione sopra assegna alla variabile $a il contenuto<br />

della prima riga del file.<br />

Ogni file viene letto sequenzialmente<br />

Esistono vari operatori per incrementare una variabile<br />

$a+=1;<br />

$a++;<br />

++$a;<br />

Condizione: if<br />

Iterazione: for<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

if (condizione) {<br />

blocco 1<br />

} else {<br />

blocco 2<br />

}<br />

Gianluca<br />

Della<br />

Vedova<br />

for (pre_istruzioni; condizione; post_istruzioni) {<br />

blocco<br />

}<br />

1 Si eseguono le pre_istruzioni;<br />

Se la condizione è vera si esegue il blocco 1<br />

altrimenti si esegue il blocco 2<br />

La parte “else” è opzionale<br />

2 Si esegue il blocco;<br />

3 Si eseguono le post_istruzioni;<br />

4 Se la condizione è vera si torna al punto 1


Iterazione: while<br />

Stringhe<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

while (condizione) {<br />

blocco<br />

}<br />

1 Se la condizione è vera:<br />

2 si esegue il blocco;<br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Perl</strong> gestisce le stringhe (frasi) nativamente.<br />

C/C++ gestiscono stringhe come sequenza di caratteri<br />

Alcuni caratteri speciali iniziano con \ (ad es. \n)<br />

3 si torna al punto 1<br />

Subroutine<br />

Subroutine<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

identificate dalla parola chiave sub<br />

il corpo è racchiuso da parentesi graffe<br />

gli argomenti passati sono in @_<br />

variabili locali alla subroutine devono essere precedute da<br />

my quando vengono usate la prima volta<br />

nel programma viene invocata con il suo nome e gli<br />

argomenti fra parentesi tonde<br />

se non ci sono argomenti si passa la stringa vuota<br />

Esempio sub<br />

Espressioni regolari<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

#!/usr/bin/perl<br />

Gianluca<br />

Della<br />

Vedova<br />

$a=;<br />

$b=;<br />

$p=1;<br />

while ($b>0) {<br />

$p=moltiplica($p,$a);<br />

}<br />

print "$p\n’’;<br />

un carattere a<br />

una concatenazione di espressioni regolari abc<br />

un insieme di caratteri [abc], [a-c]<br />

sub moltiplica {<br />

return $_[0]*$_[1];<br />

}<br />

Pattern matching<br />

Caratteri speciali<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

Una espressione regolare appare in una stringa<br />

$testo=’stringa’<br />

($testo=~/pattern/) è una condizione verificabile.<br />

($testo=~/[a-c]/) è vera<br />

($testo=~/[c-f]/) è falsa<br />

un carattere “jolly” (wildcard) .<br />

inizio riga ^<br />

fine riga $


Modificatori<br />

Modificatori<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Le parentesi tonde hanno il significato abituale di<br />

raggruppare una sottoespressione<br />

il backslash \ permette di cercare caratteri speciali ( \., \$)<br />

il punto interrogativo vuole dire che il carattere (o la<br />

sottoespressione) immediatamente precedente può apparire<br />

una volta o non apparire<br />

il + vuole dire che il carattere (o la sottoespressione)<br />

immediatamente precedente deve apparire una o più volte.<br />

L’asterisco * vuole dire che il carattere (o la<br />

sottoespressione) immediatamente precedente può apparire<br />

un numero arbitrario dii volte (anche zero)<br />

Esempi<br />

Strategia<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

$testo=’abracadabra’<br />

1 ($testo=~/abracadabra/)<br />

2 ($testo=~/ab.a/)<br />

3 ($testo=~/abbra/)<br />

4 ($testo=~/abbra/)<br />

5 ($testo=~/[bd](ab).[ar]/)<br />

6 ($testo=~/[bd](ab).[ar]/)<br />

Gianluca<br />

Della<br />

Vedova<br />

La sottostringa del testo che soddisfa il pattern viene cercata<br />

con una strategia:<br />

ingorda, perchè cerca la sottostringa più lunga<br />

sinistrorsa (leftmost) perchè cerca la sottostringa più a<br />

sinistra.<br />

(abracadabra=~/[bd](ab).*[ar]/)<br />

7 ($testo=~/[bd](ab).[ar]/)<br />

Modificatori<br />

Operatori<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gianluca<br />

Della<br />

Vedova<br />

Alcune opzioni permettono di ottenere alcune varianti di pattern<br />

matching:<br />

/i: maiuscole=minuscole<br />

/x: si possono mettere commenti nel pattern<br />

/g: si cercano tutti match<br />

Ricerca: ($testo=~/pattern/)<br />

Ricerca: ($testo=~m/pattern/)<br />

Sostituzione: ($testo=~s/origine/destinazione/)<br />

Variabili automatiche<br />

Restituzione<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Dopo un’operazione di pattern matching, il testo che<br />

realizza il pattern si trova nelle variabili $1, $2, . . .<br />

Le parentesi determinano quale variabile<br />

Gianluca<br />

Della<br />

Vedova<br />

Il risultato di un’operazione di pattern matching è<br />

se assegnato ad uno scalare e la ricerca non è globale: un<br />

valore booleano.<br />

se assegnate ad uno scalare e la ricerca è globale: la<br />

sottostringa trovata.<br />

se assegnato ad una lista: l’elenco delle sottostringhe<br />

trovate.


Array<br />

Liste<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gli array implementano funzioni ↦→ insieme<br />

$array[$indice]<br />

indice minimo = 0<br />

Una lista è una sequenza di elementi<br />

Una lista è un array<br />

@lista = ( ’’elemento1’’, ’’elemento2’’,<br />

’’elemento3’’);<br />

$#lista<br />

foreach $elemento (@lista)<br />

Hash<br />

Hash<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Hash=Dizionario<br />

Gli array implementano funzioni generiche.<br />

Chiave ⇒ Campo<br />

%dizionario={ ’’chiave1’’, ’’campo1’’,<br />

’’chiave2’’,’’campo2’’};<br />

$dizionario{chiave} = ’’campo’’<br />

while ( ( $k, $v) = each %dizionario) {<br />

print ’’$k => $v\n’’;<br />

}<br />

keys (%dizionario) elenco chiavi<br />

File<br />

Comandi<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

I file vengono identificati grazie al nome<br />

I file vengono gestiti tramite un nome simbolico (file<br />

handler)<br />

Prima di essere utilizzati i file devono essere aperti<br />

All’apertura bisogna specificare la modalità di accesso<br />

(lettura/scrittura)<br />

Alcuni file sono già aperti: STDIN STDOUT STDERR<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

open(FH, ’’< nomefile’’);<br />

minore ⇒ lettura, maggiore ⇒ scrittura<br />

while () {<br />

print STDOUT ’’$_’’; }<br />

close (FH);<br />

Librerie<br />

Moduli<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Le librerie forniscono delle nuove funzioni<br />

Una libreria deve essere richiamata prima di utilizzare<br />

funzioni fornite dalla libreria<br />

Librerie diverse possono fornire funzioni con stesso nome<br />

NomeLibreria::NomeFunzione<br />

Le librerie sono organizzate in moduli<br />

I moduli hanno una interfaccia ben definita<br />

I moduli sono divisi in pacchetti<br />

NomeModulo::NomePacchetto


Oggetti<br />

Oggetti in <strong>Perl</strong><br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gli oggetti forniscono un livello aggiuntivo di astrazione in<br />

quanto si agisce solo attraverso dei metodi<br />

implementazione opaca<br />

correlazione con librerie<br />

In perl non c’è modo per rendere l’implementazione<br />

completamente opaca<br />

Viene lasciata al programmatore la decisione se “vedere le<br />

implementazioni”<br />

Risposta: seguire le specifiche e la documentazione<br />

Oggetti in <strong>Perl</strong><br />

Astrazione<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Un oggetto è una variabile che appartiene ad una classe<br />

Un metodo è una funzione associata ad una classe o ad un<br />

oggetto.<br />

Di solito una classe è un modulo<br />

bless ($oggetto, ’’Modulo::Pacchetto’’);<br />

$risultato=Modulo::Pacchetto->metodo($argomento);<br />

Nuovi oggetti vengono creati tramite costruttori (new)<br />

L’ereditarietà genera una gerarchia di classi<br />

La variabile @ISA contiene i progenitori della classe corrente<br />

Astrazione<br />

<strong>Introduzione</strong><br />

a <strong>Perl</strong><br />

Gianluca<br />

Della<br />

Vedova<br />

Gli oggetti che non vengono più utilizzati vengono eleminati<br />

automaticamente<br />

Tramite una funzione DESTROY che specifica come<br />

distruggere l’oggetto.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!