=head1 NOME perlintro -- una breve introduzione e panoramica del linguaggio Perl =head2 DESCRIZIONE Questo documento E stato pensato per dare una veloce panoramica del linguaggio di programmazione Perl e per fornire riferimenti ad ulteriore documentazione. E pensato come una guida di autoapprendimento per i neofiti del linguaggio, e fornisce abbastanza informazioni per mettervi in grado di leggere codice Perl di altre persone e di capire a grandi linee quello che sta facendo, o di scrivere semplici script. Questo documento E introduttivo e non mira ad essere completo. Nemmeno ad essere del tutto accurato. In alcuni casi la perfezione E stata sacrificata per riuscire a rendere l'idea. E I consigliato far seguire a questa introduzione la lettura di altre informazioni dal manuale Perl completo, il cui indice puE essere trovato in L. All'interno di questo documento troverete riferimenti ad altre parti della documentazione del Perl. Potete leggere tale documentazione usando il comando C o qualunque altra cosa stiate utilizzando per leggere questo documento. =head2 Cosa E il Perl? Perl E un linguaggio di programmazione general-purpose originariamente sviluppato per la manipolazione di testo e usato attualmente per un'ampia gamma di compiti quali l'amministrazione di sistema, lo sviluppo web, la programmazione di rete, lo sviluppo di GUI e altro ancora. Il linguaggio E fatto per essere pratico (facile da usare, efficiente, completo) piuttosto che bello (piccolo, elegante, minimale). Le sue principali caratteristiche sono la facilitE d'uso, il supporto per la programmazione procedurale o orientata agli oggetti, la presenza di potenti primitive per la manipolazione del testo e il fatto di avere una delle piE impressionanti raccolte di moduli prodotti da terze parti. Ulteriori definizioni di Perl vengono date in L, L e senza dubbio anche in altri posti. Se ne puE dedurre che il Perl E percepito in maniera differente da persone differenti, ma che un sacco di persone pensa che valga almeno la pena di occuparsene. =head2 Lanciare programmi Perl Per lanciare un programma Perl dalla linea di comando Unix: perl nomeprogramma.pl Alternativamente, usate questa come prima linea del vostro script: #!/usr/bin/env perl ... e lanciate lo script come C. Naturalmente, prima lo dovrete rendere eseguibile, con C (in ambiente Unix). Per ulteriori informazioni, incluse le istruzioni per altre piattaforme quali Windows e Mac OS, leggete L. =head2 Panoramica della sintassi di base Uno script o un programma Perl consiste di una o piE istruzioni. Queste istruzioni vengono scritte semplicemente nello script una dietro l'altra. Non c'E bisogno di avere una funzione C o cose di questo genere. Le istruzioni Perl finiscono con un punto e virgola: print "Ciao, mondo!"; I commenti cominciano con un cancelletto e continuano fino alla fine della stringa. # Questo e` un commento Gli spazi sono irrilevanti print "Ciao, mondo" ; ...fatta eccezione per quando compaiono all'interno di stringhe. # Questo stamperebbe un'interruzione di linea a meta' print "Ciao mondo"; Gli apici doppi o singoli possono essere usati attorno a stringhe di caratteri: print "Ciao, mondo"; print 'Ciao, mondo'; PerE solo i doppi apici interpretano le variabili e i caratteri come i new-line (C<\n>) presenti nella stringa: print "Ciao, $nome\n"; # Funziona correttamente print 'Ciao, $nome\n'; # Stampa $nome\n, cosi' come e` scritto I numeri non hanno bisogno di essere racchiusi tra virgolette singole o doppie: print 42; Per gli argomenti delle funzioni, potete usare le parentesi oppure ometterle, a seconda del vostro gusto personale. Sono richieste soltanto a volte, per chiarire questioni di precedenza. print("Ciao, mondo"); print "Ciao, mondo"; Informazioni piE dettagliate a proposito della sintassi del Perl possono essere trovate in L. =head2 Tipi di variabile in Perl Il Perl ha tre tipi di variabile principali: scalari, array e hash. =over 4 =item Scalari Uno scalare rappresenta un singolo valore: my $animale = "cammello"; my $risposta = 42; I valori scalari possono essere stringhe, interi o numeri in virgola mobile: Perl convertirE automaticamente dall'uno all'altro secondo quanto richiesto. Non c'E bisogno di predichiarare il tipo delle vostre variabili. I valori scalari possono essere usati in vari modi: print $animale; print "L'animale e` un $animale\n"; print "Il quadrato di $risposta e` ", $risposta * $risposta, "\n"; C'E un certo numero di scalari "magici" con nomi che assomigliano a segni di punteggiatura o a rumore su una linea telefonica. Queste variabili speciali sono usate per ogni genere di scopi, e sono documentate in L. L'unica che serve conoscere, per adesso, E C<$_>, la "variabile di default". Viene usata come argomento di default per molte funzioni, e viene assegnata implicitamente da un certo numero di costrutti di iterazione. print; # Stampa il contenuto di $_ per default =item Array Un array rappresenta una lista di valori: my @animali = ("cammello", "lama", "gufo"); my @numeri = (23, 42, 69); my @misto = ("cammello", 42, 1.23); Gli array sono indiciati a partire da zero. Ecco come accedere agli elementi di un array: print $animali[0]; # stampa "cammello" print $animali[1]; # stampa "lama" La variabile speciale C<$#array> contiene l'indice dell'ultimo elemento di un array: print $misto[$#misto]; # l'ultimo elemento, stampa 1.23 Potreste essere tentati di usare C<$#array + 1> per sapere quanti elementi ci sono in un array. Non ce n'E bisogno. Accade infatti che usando C<@array> dove il Perl si aspetta di trovare un valore scalare (in altre parole "in un contesto scalare") otterrete il numero di elementi nell'array: if ( @animali < 5 ) { ... } Gli elementi che otteniamo dall'array cominciano con C<$> poichE stiamo prendendo un singolo valore dall'array -- chiedete uno scalare, ottenete uno scalare. Per ottenere valori multipli da un array: @animali[0,1]; # restituisce ("cammello", "lama"); @animali[0..2]; # restituisce ("cammello", "lama", "gufo"); @animali[1..$#animali]; # restituisce tutto eccetto il primo elemento Questa si chiama "fetta di array". Con le liste potete fare diverse cose utili: my @ordinati = sort @animali; my @alla_rovescia = reverse @numeri; Ci sono inoltre una coppia di array speciali, come C<@ARGV> (gli argomenti passati al vostro script tramite la linea di comando) e C<@_> (gli argomenti passati ad una subroutine). Sono documentati in L. =item Hash Una hash rappresenta un insieme di coppie chiave/valore: my %colore_del_frutto = ("mela", "rosso", "banana", "giallo"); Potete usare lo spazio e l'operatore C<< => >> per sistemarli in maniera migliore: my %colore_del_frutto = ( mela => "rosso", banana => "giallo", ); Per accedere agli elementi della hash: $colore_del_frutto{"mela"}; # restituisce "rosso" Potete ottenere una lista di chiavi e di valori usando C e C. my @frutti = keys %colore_del_frutto; my @colori = values %colore_del_frutto; Le hash non hanno un ordine interno particolare, perE potete ordinare le chiavi e iterare tra di esse. CosE come per gli scalari e gli array speciali, ci sono anche le hash speciali. La piE conosciuta E C<%ENV> che contiene le variabili d'ambiente. A questo proposito, potete leggere tutto in L (anche per quel che riguarda le altre variabili speciali). =back Scalari, array e hash sono documentati in maniera piE completa in L. Si possono costruire tipi di dato piE complessi usando le reference, che permettono di costruire liste e hash all'interno di liste e hash. Una reference E un valore scalare e puE riferirsi a qualunque altro tipo di dato. CosE, memorizzando una reference come valore di un array o come elemento di una hash, potete facilmente creare liste e hash all'interno di altre liste ed hash. Il seguente esempio mostra una hash di hash, ottenuta mediante reference anonime ad hash. my $variabili = { scalare => { descrizione => "singolo elemento", sigil => '$', }, array => { descrizione => "lista ordinata di elementi", sigil => '@', }, hash => { descrizione => "coppie chiave/valore", sigil => '%', }, }; print "Gli scalari cominciano con un $variabili->{'scalare'}->{'sigil'}\n"; Informazioni esaustive sulle reference possono essere trovate in L, L, L e L. =head2 Scope delle variabili Nella sezione precedente tutti gli esempi usavano la sintassi: my $variabile = "valore"; In effetti, C non E richiesto; potreste usare soltanto: $var = "value"; Tuttavia, quest'ultima istruzione creerebbe variabili globali: E una cattiva pratica di programmazione. C invece crea variabili con scope lessicale. Lo scope delle variabili si estende al blocco (vale a dire un gruppo di istruzioni delimitate da parentesi graffe) in cui esse sono definite. my $a = "pippo"; if ($una_certa_condizione) { my $b = "pluto"; print $a; # stampa "pippo" print $b; # stampa "pluto" } print $a; # stampa "pippo" print $b; # non stampa nulla; $b e` finito fuori dallo scope Usare C in combinazione con C in cima al proprio script Perl significa che l'interprete si accorgerE di alcuni tipici errori di programmazione. Nell'esempio precedente, il C finale avrebbe causato un errore nella fase di compilazione e avrebbe impedito di lanciare il programma. Usare C E caldamente consigliato. =head2 Costrutti condizionali e di loop Il Perl ha molti degli usuali costrutti condizionali e di loop, fatta eccezione per il costrutto case/switch (ma se davvero lo volete, c'E il modulo Switch all'interno di Perl 5.8 e successivi, e su CPAN. Consultate la sezione sui moduli, sotto, per ulteriori informazioni a proposito dei moduli e di CPAN). Le condizioni possono essere rappresentate da qualunque espressione Perl. Confrontate la lista di operatori nella prossima sezione per informazioni sugli operatori logici e di confronto, che sono comunemente usati nelle istruzioni condizionali. =over 4 =item if if ( condizione ) { ... } elsif ( altra condizione ) { ... } else { ... } Ce n'E anche una versione negata: unless ( condizione ) { ... } E fornita come una versione piE leggibile di C)>. Va notato che in Perl le parentesi sono richieste, anche se nel blocco avete una sola linea. Tuttavia, c'E un metodo piE furbo per rendere piE simili all'inglese i vostri blocchi condizionali costituiti da una sola linea: # il modo tradizionale if ($frizzante) { print "Si`!"; } # la versione "a la Perl", con una post-condizione print "Si`!" if $frizzante; print "Non abbiamo banane" unless $banane; =item while while ( condizione ) { ... } Ce n'E anche una versione negata, per la stessa ragione per cui esiste C: until ( condizione ) { ... } Potete anche usare C in una post-condizione: print "LA LA LA\n" while 1; # ciclo infinito =item for Esattamente come in C: for ($i=0; $i <= $max; $i++) { ... } In Perl si ha raramente bisogno del ciclo for in stile C, poichE il Perl fornisce un metodo piE veloce per iterare su una lista: C. =item foreach foreach (@array) { print "Questo elemento vale $_\n"; } # Non siete nemmeno obbligati ad usare il default $_ ... foreach my $chiave (keys %hash) { print "Il valore di $chiave e` $hash{$chiave}\n"; } =back Per ulteriori dettagli sui costrutti di loop (anche su alcuni che non sono stati nominati in questa panoramica), consultate L. =head2 Operatori e funzioni Perl fornisce un'ampia selezione di funzioni builtin. Alcune di quelle che abbiamo giE visto sono C, C and C. All'inizio di L ce n'E una lista e potete facilmente ottenere informazioni su ciascuna di esse usando C>. Gli operatori sono documentati nei particolari in L, ma ecco alcuni dei piE comuni: =over 4 =item Aritmetici + addizione - sottrazione * multiplicazione / divisione =item Confronto Numerico == uguaglianza != disuaguaglianza < minore > maggiore <= minore o uguale >= maggiore o uguale =item Confronto tra stringhe eq uguaglianza ne disuguaglianza lt minore gt maggiore le minore o uguale ge maggiore o uguale (PerchE esistono confronti numerici e lessicografici separati? PerchE non abbiamo tipi di variabile speciali, e Perl ha bisogno di sapere se deve ordinare numericamente (il 99 viene prima del 100) o in maniera lessicografica (e il 100 viene prima del 99). =item Logica booleana && and || or ! not (C, C e C non sono soltanto nella tabella come descrizione degli operatori -- sono anche supportati come operatori veri e propri. Sono piE leggibili dei corrispondenti operatori C-style, ma hanno una precedenza differente rispetto a C<&&> e company. Consultate L per ulteriori dettagli). =item Miscellanea = assegnmento . concatenazione di stringhe x moltiplicazione di stringhe .. range operator (crea una lista di numeri) Molti operatori possono essere messi assieme con un C<=>, come segue: $a += 1; # lo stesso che $a = $a + 1 $a -= 1; # lo stesso che $a = $a - 1 $a .= "\n"; # lo stesso che $a = $a . "\n"; =head2 File e I/O Potete aprire un file per l'input e l'output usando la funzione C. E documentata in maniera tremendamente dettagliata in L e L ma, in sintesi: open(INFILE, "input.txt") or die "Non posso aprire input.txt: $!"; open(OUTFILE, ">output.txt") or die "Non posso aprire output.txt: $!"; open(LOGFILE, ">>my.log") or die "Non posso aprire logfile: $!"; Potete leggere da un filehandle aperto usando l'operatore C<< <> >>. In un contesto scalare legge una singola linea dal filehandle, e in un contesto di lista legge l'intero file, assegnando ogni linea ad un elemento della lista: my $linea = ; my @linee = ; La lettura dell'intero file in un colpo solo E chiamata I. PuE essere utile, ma puE anche essere uno spreco di memoria. La maggior parte delle elaborazioni su file di testo puE essere fatta una linea alla volta, usando i costrutti di loop del Perl. L'operatore C<< <> >> E molto spesso usato in un ciclo C: while () { # Ad ogni iterazione assegna una linea del file a $_ print "Ho appena letto questa linea: $_"; } Abbiamo giE visto come stampare sullo standard output usando C. C puE anche accettare, perE, un parametro opzionale che specifica su quale filehandle si deve stampare: print STDERR "Questo e` il tuo ultimo avvertimento.\n"; print OUTFILE $record; print LOGFILE $messaggio; Quando avete finito con i vostri filehandle, dovreste chiuderli con C (anche se, per la veritE, Perl metterE in ordine le cose al posto vostro se ve lo dimenticate): close INFILE; =head2 Espressioni regolari Il supporto di Perl per le espressioni regolari E allo stesso tempo ampio e profondo, ed E il soggetto della documentazione che si puE trovare in L, L e altrove. Ad ogni modo, brevemente: =over 4 =item Matching semplice if (/foo/) { ... } # vero se $_ contiene "foo" if ($a =~ /foo/) { ... } # vero se $a contiene "foo" L'operatore di sostituzione C E documentato in L. Per default opera su C<$_>, ma puE essere "legato" ad un altra variabile usando l'operatore di binding, C<=~> (a sua volta documentato in L). =item Sostituzioni semplici s/pippo/pluto/; # sostituisce pippo con pluto in $_ $a =~ s/pippo/pluto/; # sostituisce pippo con pluto in $a $a =~ s/pippo/pluto/g; # sostituisce TUTTE LE OCCORRENZE di pippo con pluto in $a L'operatore di sostituzione C E documentato in L. =item Espressioni regolari piE complesse Non E necessario che facciate matching con stringhe fisse. In effetti, potete fare matching con tutto quello che vi passa per la testa, usando espressioni regolari piE complesse. Sono documentate in dettaglio in L, ma nel frattempo ecco un piccolo schema riassuntivo: . un singolo carattere \s un carattare 'blank' (spazio, tab, newline) \S un carattere non-'blank' \d una cifra (0-9) \D un carattare che non sia una cifra \w un carattere alfanumerico (a-z, A-Z, 0-9, _) \W un carattere non alfanumerico [aeiou] corrisponde ad un singolo carattere nell'insieme dato [^aeiou] corrisponde ad un singolo carattere nel complemento dell'insieme dato (foo|bar|baz) corrisponde ad una qualunque delle alternative specificate ^ inizio della stringa $ fine della stringa I quantificatori possono essere utilizzati per specificare quante volte volete che l'ultima "cosa" menzionata venga matchata, dove "cosa" sta a significare un singolo carattere, uno dei metacaratteri appena elencati, oppure un gruppo di caratteri o metacaratteri fra parentesi. * zero o piu` occorrenze dell'ultimo elemento + una o piu` occorrenze dell'ultimo elemento ? zero o una occorrenza dell'ultimo elemento {3} esattamente 3 occorrenze dell'ultimo elemento {3,6} tra le 3 e le 6 occorrenze dell'ultimo elemento {3,} 3 o piu` occorrenze dell'ultimo elemento Alcuni brevi esempi: /^\d+/ la stringa comincia con uno o piu` caratteri /^$/ non c'e` nulla nella stringa (inizio e fine sono adiacenti) /(\d\s){3}/ tre cifre, ognuna seguita da uno spazio (ad es. "3 4 5 ") /(a.)+/ una stringa nella quale ogni carattere in posizione dispari e` una 'a' (ad es. "abacadaf") # Questo ciclo legge da STDIN, e stampa tutte le righe non-vuote: while (<>) { next if /^$/; print; } =item Parentesi per "catturare" Oltre che per raggruppare, le parentesi servono ad un altro scopo. Possono essere utilizzate per catturare i risultati del matching dell'espressione regolare, per uso futuro. I risultati finiscono in C<$1>, C<$2> e cosE via. # una maniera semplice e sporca per spezzare un indirizzo email in due parti if ($email =~ /([^@])+@(.+)/) { print "Il nome utente e` $1\n"; print "Il nome dell'host e` $2\n"; } =item Altre caratteristiche delle espressioni regolari Le espressioni regolari supportano i riferimenti all'indietro (backreference), quelli in avanti (lookahead) e qualunque tipo piE complesso di dettagli. Leggete L, L, L. =back =head2 Scrivere subroutine Scrivere subroutine E facile: sub log { my $messaggiodilog = shift; print LOGFILE $messaggiodilog; } Cos'E quello C? Gli argomenti per una subroutine sono disponibili in uno speciale array chiamato C<@_> (consultate L per altre informazioni in proposito). L'argomento di default della funzione C E C<@_>. Quindi C toglie il primo elemento fuori dalla lista e lo assegna a C<$messaggiodilog>. Si puE manipolare C<@_> anche in altri modi: my ($messaggiodilog, $priorita) = @_; # comune my $messaggiodilog = $_[0]; # poco comune, e orribile Le subroutine possono anche restituire valori: sub square { my $num = shift; my $result = $num * $num; return $result; } Per ulteriori informazioni sulla scrittura di subroutine, si veda L. =head2 Perl OO La programmazione orientata agli oggetti in Perl E relativamente semplice ed E implementata usando delle reference che sono a conoscenza di che tipo di oggetto sono, basata sul concetto dei package del Perl. Ad ogni modo, la programmazione orientata agli oggetti in Perl va ampiamente al di lE dello scopo di questo documento. Leggete L, L, L e L. Come programmatori Perl alle prime armi, l'uso piE comune della programmazione orientata agli oggetti in Perl che potete fare sarE nell'utilizzo di moduli di terze parti, che E documentato di seguito. =head2 Usare i moduli Perl I moduli Perl forniscono una serie di caratteristiche per aiutarvi a non reinventare la ruota, e possono essere scaricati da CPAN ( http://www.cpan.org ). Un certo numero di moduli di uso comune E incluso nella stessa distribuzione di Perl. Le categorie spaziano dalla manipolazione del testo ai protocolli di rete, dall'integrazione con database alla grafica. Anche una lista di moduli per categoria E disponibile tramite CPAN. Per imparare ad installare i moduli scaricati da CPAN, leggete L. Per imparare ad utilizzare un dato modulo, usate C>. Tipicamente si tratterE di C, che vi darE accesso alle funzioni esportate o ad un'interfaccia ad oggetti al modulo. L contiene domande e risposte relative a molti compiti comuni, e spesso fornisce suggerimenti sui moduli CPAN validi da usare. L descrive i moduli Perl in generale. L elenca i moduli che vengono forniti con la distribuzione Perl standard. Se sentite il bisogno di scrivere moduli Perl, L vi darE buoni consigli. =head1 AUTORE Kirrily "Skud" Robert =head1 TRADUZIONE =head2 Versione La versione su cui si basa questa traduzione E ottenibile con: perl -MPOD2::IT -e print_pod perlintro Per maggiori informazioni sul progetto di traduzione in italiano si veda L . =head2 Traduttore Traduzione a cura di Stefano Rodighiero Elarsen at perl.itE. =head2 Revisore Revisione a cura di dree. =cut