Tecnologie lato Server: CGI e Perl © 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) Stefano Clemente
27 Ottobre 2005Stefano Clemente2 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 Ottobre 2005Stefano Clemente3 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 2005Stefano Clemente4 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 2005Stefano Clemente5 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 2005Stefano Clemente6 Installazione di Perl Download dal sito ftp://ftp.activestate.com/ActivePerl/Win dows/5.8ftp://ftp.activestate.com/ActivePerl/Win dows/5.8 Versione più recente − ActivePerl MSWin32-x86.msi
27 Ottobre 2005Stefano Clemente7 Installazione di Perl
27 Ottobre 2005Stefano Clemente8 Installazione di Perl
27 Ottobre 2005Stefano Clemente9 Installazione di Perl
27 Ottobre 2005Stefano Clemente10 Installazione di Perl
27 Ottobre 2005Stefano Clemente11 Installazione di Perl
27 Ottobre 2005Stefano Clemente12 Installazione di Perl
27 Ottobre 2005Stefano Clemente13 Installazione di Perl
27 Ottobre 2005Stefano Clemente14 Installazione di Perl
27 Ottobre 2005Stefano Clemente15 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 printBenvenuti in Perl!\n\nLa 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 2005Stefano Clemente16 Esempio 1
27 Ottobre 2005Stefano Clemente17 Perl Perl è case sensitive ;Ogni comando è concluso da un carattere “;” printLe 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 ( $ =array, % =hash)
27 Ottobre 2005Stefano Clemente18 Tipi di dati Tipo di dato Formato nome variabile Descrizione scalare$nomeStringhe, numeri interi, numeri in virgola mobile, riferimenti ordinata di valori scalari accessibili attraverso indici hash%nomeLista non ordinata di valori scalari accessibili per mezzo valori scalari unici
27 Ottobre 2005Stefano Clemente19 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 2005Stefano Clemente20 Esempio 2
27 Ottobre 2005Stefano Clemente21 undef undefLe variabili non inizializzate valgono undef, che assume valori diversi a seconda del contesto undef − nel contesto numerico undef = 0 undef − 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 "15abcdefghilm1" "15abcdefghilm1"nell’esempio la stringa "15abcdefghilm1" è tradotta nel numero 15, ma il risultato dell’operazione che la usa è "15abcdefghilm1"
27 Ottobre 2005Stefano Clemente22 variabili array devono avere il nome preceduto Ogni elemento è riferito con la sintassi $ [ ] 0Il 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 2005Stefano Clemente23 Array L’inizializzazione può avvenire − assegnando direttamente un elenco di = (, …, ); − assegnando un valore ad ogni singolo elemento $ [ ] = ;.. − assegnando un elenco “range” attraverso l’operatore “.. ”, che comporta l’assegnazione di tutti i valori compresi tra il valore iniziale e quello = (.. );
27 Ottobre 2005Stefano Clemente24 Array Gli elementi di un array possono essere stampati attraverso la funzione print print ( \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 );
27 Ottobre 2005Stefano Clemente25 Esempio 3 #!c:\perl\bin\perl.exe # Esempio slide 16-17: esempio3.pl # Uso degli = ( "Pippo", "Pluto", "Paperino", "Zio Paperone" ); print( "Contenuto ); print( "Stampa dell'array fuori dagli apici: "\n\n" ); print( "Terzo elemento: $array[ 2 ]\n" ); $numero = 3; print( "Quarto elemento: $array[ $numero ]\n\n" = ( 'A'.. 'Z' ); print( "Elenco delle lettere maiuscole ottenuta con l'operatore range\n" ); print( \n\n" ); $array3[ 3 ] = "Quarto"; print( "Array con un solo elemento \n\n" ); print( 'Stampa con uso di apici singoli: ' ); print( e \n', "\n" ); print( "Stampa con uso di backslash: " ); print( e \\n\n" );
27 Ottobre 2005Stefano Clemente26 Esempio 3
27 Ottobre 2005Stefano Clemente27 Esempio 4 #!c:\perl\bin\perl.exe # Esempio slide 18-19: esempio4.pl # Uso degli array e operatori di confronto su = qw( mela pera banana ); foreach $elemento ) { if ( $elemento eq "mela" ) { if ( $elemento eq "mela" ) { print( "La stringa '$elemento' corrisponde alla stringa 'mela'\n" ); print( "La stringa '$elemento' corrisponde alla stringa 'mela'\n" ); } if ( $elemento ne "mela" ) { if ( $elemento ne "mela" ) { print( "La stringa '$elemento' non corrisponde alla stringa 'mela'\n" ); print( "La stringa '$elemento' non corrisponde alla stringa 'mela'\n" ); } if ( $elemento lt "mela" ) { if ( $elemento lt "mela" ) { print( "La stringa '$elemento' e' minore della stringa 'mela'\n" ); print( "La stringa '$elemento' e' minore della stringa 'mela'\n" ); } if ( $elemento gt "mela" ) { if ( $elemento gt "mela" ) { print( "La stringa '$elemento' e' maggiore della stringa 'mela'\n" ); print( "La stringa '$elemento' e' maggiore della stringa 'mela'\n" ); }}
27 Ottobre 2005Stefano Clemente28 Esempio 4
27 Ottobre 2005Stefano Clemente29 Operatori di confronto eqne ltgtGli 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 2005Stefano Clemente30 Operatori di confronto stringhe: match m//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 $stringa1, m// /$stringa1 =~Per verificare se $stringa1 contiene, si usa l’operatore m// con 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 =~ / /; $stringa1 =~ / /; cerca in tutta la stringa $stringa1 =~ /^ /; $stringa1 =~ /^ /; cerca all’inizio della stringa $stringa1 =~ / $/; $stringa1 =~ / $/; cerca alla fine della stringa
27 Ottobre 2005Stefano Clemente31 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 ( _ ) \bQuesto tipo di ricerca è effettuata attraverso la specifica del simbolo \b all’interno dell’operatore match
27 Ottobre 2005Stefano Clemente32 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 − \w per un singolo carattere − \w+ − \w+ per più caratteri $1, $2, … 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 computer /computer/i − se la stringa da cercare è “ computer ” e si vuole ignorare il controllo delle maiuscole/minuscole si scriverà la stringa come /computer/i g − se si vuole che la ricerca restituisca tutti gli elementi trovati e non si fermi al primo, bisogna aggiungere il modificatore g
27 Ottobre 2005Stefano Clemente33 match: quantificatori QuantificatoreDescrizione {n} n Esattamente n volte {m,n} mn Tra m e n volte {n, } n n o più volte + {1, } Una o più volte (= {1, } ) * {0, } Nessuna o più volte (= {0, } ) ? {0, 1} Una o nessuna (= {0, 1} )
27 Ottobre 2005Stefano Clemente34 match: simboli SimboloDescrizione ^ All’inizio della riga $ Alla fine della riga \b word boundary \B nonword boundary \w carattere alfanum parola \W Carattere non parolaSimboloDescrizione\d Cifra (0-9) \D Non cifra \s Spazio \S Non spazio \n newline \t tab
27 Ottobre 2005Stefano Clemente35 match: modificatori ModificatoreDescrizione 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 2005Stefano Clemente36 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" ); print( "String 'Now' was found.\n" );} if ( $search =~ /^Now/ ) { print( "String 'Now' was found at the beginning of the line." ); print( "String 'Now' was found at the beginning of the line." ); print( "\n" ); print( "\n" );} if ( $search =~ /Now$/ ) { print( "String 'Now' was found at the end of the line.\n" ); 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" ); print( "Word found ending in 'ow': $1 \n" );} if ( $search =~ /\b ( \w+ ) \s ( \1 ) \b/x ) { print( "Repeated words found: $1 $2 \n" ); print( "Repeated words found: $1 $2 \n" = ( $search =~ / \b ( t \w+ ) \b /gx ); print( "Words beginning with 't' );
27 Ottobre 2005Stefano Clemente37 Esempio 5
27 Ottobre 2005Stefano Clemente38 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 2005Stefano Clemente39 Variabili hash $ { }L’accesso ad un elemento dell’hash avviene con la sintassi $ { } keys ( % )La funzione keys restituisce un array non ordinato che contiene tutte le chiavi dell’hash es: keys ( % ) sort ( keys ( % ) )Volendo ottenere un array per ordine di chiave si può utilizzare la funzione sort es: sort ( keys ( % ) )