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
Scarica

Lucidi 8