Tecnologie lato Server: CGI e Perl Stefano Clemente [email protected] © 2005 Stefano Clemente I lucidi sono in parte realizzati con materiale tratto dal libro di testo adottato tradotto in italiano: © 2002 Prentice Hall H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) Riferimenti bibliografici • H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) ed. Prentice Hall 2002 Capitolo 27 • http://www.perl.org • http://www.activestate.com/perl 27 Ottobre 2005 Stefano Clemente 2 Introduzione • Perl (Practical Extraction and Report Language) fu creato da Larry Wall nel 1987 per monitorare progetti software di grandi dimensioni e generare dei report − gli obiettivi che Wall si poneva di raggiungere erano di creare un linguaggio che fosse • più potente degli script di shell e più flessibile del C • dotato di grandi capacità di elaborazione di testi • ma, soprattutto, che rendesse le operazioni della programmazione comune molto dirette e facili • CGI (Common Gateway Interface) è un protocollo standard per permettere agli utenti di interagire con applicazioni su web server − CGI è un’interfaccia • non può essere programmata direttamente • per interagire con essa bisogna eseguire un programma o uno script (script CGI) − Gli script CGI possono essere scritti in diversi linguaggi di programmazione • Perl è il più comunemente utilizzato per la sua potenza, flessibilità e infine per l’elevata disponibilità di programmi 27 Ottobre 2005 Stefano Clemente 3 Introduzione • Interazione client/server quando il client richiede un documento che si riferisce ad uno script CGI • Spesso gli script elaborano informazioni ricavate da FORM − es. verifica della carta di credito e notifica al cliente dell’avvenuto pagamento o del rifiuto • Sul server devono essere concessi i permessi per l’esecuzione degli script CGI tipicamente file con estensione .cgi o .pl posizionati in directory particolari (cgi-bin) • Il risultato restituito dall’applicazione viene inoltrato al client in forma di (X)HTML e può contenere immagini, audio, XML, Flash ecc. 27 Ottobre 2005 Stefano Clemente 4 Introduzione • Applicazioni − interagiscono con l’utente attraverso • standard input • standard output • Nel caso degli script CGI, Common Gateway interface è una pipe che redirige all’applicazione l’input proveniente dal browser (es. FORM) e redirige al client web l’output proveniente dall’applicazione 27 Ottobre 2005 Stefano Clemente 5 Installazione di Perl • Download dal sito http://www.activestate.com • ftp://ftp.activestate.com/ActivePerl/Win dows/5.8 • Versione più recente − ActivePerl-5.8.4.810-MSWin32-x86.msi 27 Ottobre 2005 Stefano Clemente 6 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 7 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 8 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 9 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 10 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 11 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 12 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 13 Installazione di Perl 27 Ottobre 2005 Stefano Clemente 14 Esempio 1 #!c:\perl\bin\perl.exe # Esempio slide 6-7: esempio1.pl # Primo programma in Perl. print( "Benvenuti in Perl!\n" ); • Le righe che cominciano con “#” sono righe di commento • “#!” non rappresenta un commento ma un costrutto “shebang” che nei sistemi Unix e in Apache indica dove si trova l’interprete Perl • La riga print stampa a standard output la stringa “Benvenuti in Perl!\n” dove \n è il newline • Questo script non usa CGI; può essere eseguito da una finestra DOS (previa installazione di ActivePerl) 27 Ottobre 2005 Stefano Clemente 15 Esempio 1 27 Ottobre 2005 Stefano Clemente 16 Perl • Perl è case sensitive • Ogni comando è concluso da un carattere “;” • Le parentesi che racchiudono gli argomenti di una funzione (es. print) non sono obbligatorie, ma consigliate per maggiore chiarezza • Perl dispone di tre tipi di dato − scalare − array − hash e ogni nome di variabile è preceduto da un carattere speciale che identifica il tipo di dato del valore della variabile ($=scalare, @=array, %=hash) 27 Ottobre 2005 Stefano Clemente 17 Tipi di dati Tipo di dato scalare Formato nome variabile $nome array @nome hash %nome 27 Ottobre 2005 Descrizione Stringhe, numeri interi, numeri in virgola mobile, riferimenti Lista ordinata di valori scalari accessibili attraverso indici Lista non ordinata di valori scalari accessibili per mezzo valori scalari unici Stefano Clemente 18 Esempio 2 #!c:\perl\bin\perl.exe # Esempio slide 10-11: esempio2.pl # Uso delle variabili scalari. $numero = 5; print( "Valore della variabile \$numero: $numero\n\n" ); $numero += 5; print( "La variabile \$numero dopo averle sommato 5 vale: $numero\n" ); $numero *= 2; print( "La variabile \$numero dopo averla moltiplicata per 2 vale: " ); print( "$numero\n\n\n" ); # Uso di una variabile non inizializzata in una stringa print( "Uso di una variabile prima dell'inizializzazione: $variabile\n\n" ); # Uso di una variabile non inizializzata in calcoli $test = $noninizializzata + 5; print( "Sommando la variabile non inizializzata \$undefined a 5 restituisce: $test\n" ); # Uso di stringhe in calcoli numerici $stringa = "questa è una stringa"; $numero += $stringa; print( "La somma di una stringa a un numero restituisce: $numero\n" ); $stringa2 = "15abcdefghilm1"; $numero2 = $numero + $stringa2; print( "Sommando $numero a \"$stringa2\" restituisce: $numero2\n" ); 27 Ottobre 2005 Stefano Clemente 19 Esempio 2 27 Ottobre 2005 Stefano Clemente 20 undef • Le variabili non inizializzate valgono undef, che assume valori diversi a seconda del contesto − nel contesto numerico undef = 0 − nel contesto stringhe undef = “” • L’uso di stringhe nel contesto numerico è soggetto alle seguenti regole − se la stringa non inizia con nessun numero, viene considerata undef − se la stringa comincia con dei numeri viene considerata come se fosse un numero, ma il suo valore non viene cambiato • nell’esempio la stringa "15abcdefghilm1" è tradotta nel numero 15, ma il risultato dell’operazione che la usa è "15abcdefghilm1" 27 Ottobre 2005 Stefano Clemente 21 Array • Le variabili array devono avere il nome preceduto da @ • Ogni elemento è riferito con la sintassi $<nome>[ <indice> ] • Il primo elemento ha indice 0 • Non è necessario definire le dimensioni dell’array − ogni volta che si cerca di assegnare un valore a un elemento non definito, l’interprete Perl provvede a estendere l’array 27 Ottobre 2005 Stefano Clemente 22 Array • L’inizializzazione può avvenire − assegnando direttamente un elenco di valori @<nome> = ( <val_1>, … , <val_n> ); − assegnando un valore ad ogni singolo elemento $<nome>[ <indice> ] = <valore>; − assegnando un elenco “range” attraverso l’operatore “..”, che comporta l’assegnazione di tutti i valori compresi tra il valore iniziale e quello finale @<nome> = ( <inizio> .. <fine> ); 27 Ottobre 2005 Stefano Clemente 23 Array • Gli elementi di un array possono essere stampati attraverso la funzione print print ( “@<nome>\n” ); in questo caso sono stampati per default ognuno separato dall’altro da uno spazio. Il carattere di separazione è definito dalla variabile $” e volendolo modificare basta assegnare un altro valore $” = “/”; • Se la funzione print viene invocata senza racchiudere l’array tra apici, non verrà stampato il carattere di separazione degli elementi print ( @<nome> ); 27 Ottobre 2005 Stefano Clemente 24 Esempio 3 #!c:\perl\bin\perl.exe # Esempio slide 16-17: esempio3.pl # Uso degli array. @array = ( "Pippo", "Pluto", "Paperino", "Zio Paperone" ); print( "Contenuto dell'array: @array\n" ); print( "Stampa dell'array fuori dagli apici: ", @array, "\n\n" ); print( "Terzo elemento: $array[ 2 ]\n" ); $numero = 3; print( "Quarto elemento: $array[ $numero ]\n\n" ); @array2 = ( 'A' .. 'Z' ); print( "Elenco delle lettere maiuscole ottenuta con l'operatore range\n" ); print( "@array2 \n\n" ); $array3[ 3 ] = "Quarto"; print( "Array con un solo elemento inizializzato: @array3 \n\n" ); print( 'Stampa con uso di apici singoli: ' ); print( '@array e \n', "\n" ); print( "Stampa con uso di backslash: " ); print( "\@array e \\n\n" ); 27 Ottobre 2005 Stefano Clemente 25 Esempio 3 27 Ottobre 2005 Stefano Clemente 26 Esempio 4 #!c:\perl\bin\perl.exe # Esempio slide 18-19: esempio4.pl # Uso degli array e operatori di confronto su stringhe. @frutta = qw( mela pera banana ); foreach $elemento ( @frutta ) { if ( $elemento eq "mela" ) { print( "La stringa '$elemento' corrisponde alla stringa 'mela'\n" ); } if ( $elemento ne "mela" ) { print( "La stringa '$elemento' non corrisponde alla stringa 'mela'\n" ); } if ( $elemento lt "mela" ) { print( "La stringa '$elemento' e' minore della stringa 'mela'\n" ); } if ( $elemento gt "mela" ) { print( "La stringa '$elemento' e' maggiore della stringa 'mela'\n" ); } } 27 Ottobre 2005 Stefano Clemente 27 Esempio 4 27 Ottobre 2005 Stefano Clemente 28 Operatori di confronto • Gli operatori di confronto eq (equal), ne (not equal), lt (less than) e gt (greater then) sono per il confronto di stringhe • Gli operatori destinati al confronto numerico sono ==, !=, <, <=, >, >= • L’uso di un operatore di confronto stringhe per confrontare numeri (o il viceversa) è un errore nel programma 27 Ottobre 2005 Stefano Clemente 29 Operatori di confronto stringhe: match • Un operatore molto potente per il confronto delle stringhe è l’operatore m// (match), utile per cercare determinati elementi all’interno di una stringa, che richiede due operandi • Per verificare se $stringa1 contiene <stringa>, si usa l’operatore m// con <stringa> come primo operando che compare tra i caratteri / dell’operatore, $stringa1 come secondo operando che è assegnato all’operatore di confronto attraverso l’operatore =~ (operatore di binding) $stringa1 =~ /<stringa>/; cerca in tutta la stringa $stringa1 =~ /^<stringa>/; cerca all’inizio della stringa $stringa1 =~ /<stringa>$/; cerca alla fine della stringa 27 Ottobre 2005 Stefano Clemente 30 Operatori di confronto stringhe: match • Confronti più sofisticati possono essere eseguiti su − tutte le parole che compongono una stringa (word boundary) − sulle restanti parti (nonword boundary) • Con word boundary si intende la porzione di una stringa compresa tra un carattere alfanumerico e un carattere non alfanumerico • I caratteri alfanumerici sono − − − − numeri da 0 a 9 caratteri alfabetici minuscoli caratteri alfabetici maiuscoli underscore (_) • Questo tipo di ricerca è effettuata attraverso la specifica del simbolo \b all’interno dell’operatore match 27 Ottobre 2005 Stefano Clemente 31 Operatori di confronto stringhe: match • Nella modalità word boundary si possono cercare le parole che cominciano finiscono con certe lettere utilizzando la sequenza di escape − \w per un singolo carattere − \w+ per più caratteri i risultati sono memorizzati nelle variabili di Perl $1, $2, … • Si possono aggiungere dei modificatori alla stringa da cercare che modificano il processo del confronto − se la stringa da cercare è “computer” e si vuole ignorare il controllo delle maiuscole/minuscole si scriverà la stringa come /computer/i − se si vuole che la ricerca restituisca tutti gli elementi trovati e non si fermi al primo, bisogna aggiungere il modificatore g 27 Ottobre 2005 Stefano Clemente 32 match: quantificatori Quantificatore {n} Descrizione Esattamente n volte {m,n} {n, } + * Tra m e n volte n o più volte Una o più volte (= {1, }) Nessuna o più volte (= {0, }) ? Una o nessuna (= {0, 1}) 27 Ottobre 2005 Stefano Clemente 33 match: simboli Simbolo Descrizione ^ All’inizio della riga $ Alla fine della riga Simbolo \d Descrizione Cifra (0-9) \D Non cifra \b word boundary \s Spazio \B nonword boundary \S Non spazio \w carattere alfanum parola \n newline \W Carattere non parola \t tab 27 Ottobre 2005 Stefano Clemente 34 match: modificatori Modificatore Descrizione g Esegue la ricerca di tutte le occorrenze e non solo della prima i Ricerca case insensitive m Non ignora i newline s Ignora i newline trattandoli come spazi x Ignora gli spazi 27 Ottobre 2005 Stefano Clemente 35 Esempio 5 #!c:\perl\bin\perl.exe # Esempio slide 27-28: esempio5.pl # Uso dell'operatore m// (match). $search = "Now is is the time"; print( "Test string is: '$search'\n\n" ); if ( $search =~ /Now/ ) { print( "String 'Now' was found.\n" ); } if ( $search =~ /^Now/ ) { print( "String 'Now' was found at the beginning of the line." ); print( "\n" ); } if ( $search =~ /Now$/ ) { print( "String 'Now' was found at the end of the line.\n" ); } if ( $search =~ /\b ( \w+ ow ) \b/x ) { print( "Word found ending in 'ow': $1 \n" ); } if ( $search =~ /\b ( \w+ ) \s ( \1 ) \b/x ) { print( "Repeated words found: $1 $2 \n" ); } @matches = ( $search =~ / \b ( t \w+ ) \b /gx ); print( "Words beginning with 't' found: @matches\n" ); 27 Ottobre 2005 Stefano Clemente 36 Esempio 5 27 Ottobre 2005 Stefano Clemente 37 Variabili hash • Le variabili di tipo hash devono avere il nome preceduto da % • Un hash è un insieme non ordinato di coppie di valori scalari • Ogni elemento dell’hash è acceduto per mezzo di una chiave, una stringa unica per tutto l’hash che è associata a quell’elemento • L’hash è anche detto array associativo a causa del fatto che chiavi e valori sono associati a coppie 27 Ottobre 2005 Stefano Clemente 38 Variabili hash • L’accesso ad un elemento dell’hash avviene con la sintassi $<nome_hash>{ <nome_chiave> } • La funzione keys restituisce un array non ordinato che contiene tutte le chiavi dell’hash es: keys ( %<nome_hash> ) • Volendo ottenere un array per ordine di chiave si può utilizzare la funzione sort es: sort ( keys ( %<nome_hash> ) ) 27 Ottobre 2005 Stefano Clemente 39