1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

82
1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce

Transcript of 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

Page 1: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

1

Introduzione agli scripting languages

ed ai WEB tools

Introduzione agli scripting languages

ed ai WEB toolsDario MenasceDario Menasce

Page 2: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

2

IntroduzioneIntroduzione

• Cosa sono gli scripting languages

• Perche’ ci interessa PERL in particolare rispetto ad altri linguaggi di scripting

• Guida di sopravvivenza minimale

• Breve introduzione alla sintassi

• Sviluppo di un semplice esempio come programma stand-alone

• Breve introduzione al protocollo HTML e CGI

• Interfacciamento del programma di esempio ad un WEB browser

• Suggerimenti per reperire documentazione in rete

• Conclusioni

• Cosa sono gli scripting languages

• Perche’ ci interessa PERL in particolare rispetto ad altri linguaggi di scripting

• Guida di sopravvivenza minimale

• Breve introduzione alla sintassi

• Sviluppo di un semplice esempio come programma stand-alone

• Breve introduzione al protocollo HTML e CGI

• Interfacciamento del programma di esempio ad un WEB browser

• Suggerimenti per reperire documentazione in rete

• Conclusioni

Page 3: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

3

Scripting language ---> collante tra le funzionalita’ di un sistema operativoo, piu’ in generale, tra le funzioni primitive di un ambiente applicativo.

Scripting language ---> collante tra le funzionalita’ di un sistema operativoo, piu’ in generale, tra le funzioni primitive di un ambiente applicativo.

Cos’e’ uno scripting language?Cos’e’ uno scripting language?

Page 4: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

4

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Gli shell script sono legati non solo al soggiacente sistema operativo (UNIX, Win98…)ma addirittura alla particolare shell in uso (sh, bash, tcsh, …) (problemi di portabilita’)D’altra parte uno shell script per girare necessita di minime risorse di sistema.Questo e’ molto importante per un sistemista, in quanto una macchina in grado difunzionare in modo minimale e’ sicuramente dotata almeno di una shell (generalmentela shell sh), per cui gli script di quella shell potranno, in linea di principio, funzionareanche in assenza di ulteriori risorse, quali un interpreter PERL.

Kumac e’ lo scripting language nativo di PAW: abbastanza sofisticato ma non dotato di capacita’ di interazione col sistema operativo. Vedremo come e’ possibile usarePERL (con grande vantaggio e soddisfazione) per fargli generare degli scriptkumac (un modo di usare PERL come meta-linguaggio)

Page 5: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

5

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Tcl/Tk e’ una coppia di linguaggi adatti alla creazione di interfacce grafiche.Tcl e’ sofisticato, ma dotato di strutture di dati non sufficientemente articolate.Esiste un modulo di PERL, chiamato PERL/Tk, che sostituisce Tcl nella coppia dilinguaggi: e’ possibile con esso scrivere sofisticate interfacce utente, come ad esempio un completo browser o un’interfaccia ad un DAQ.

JavaScript e’ uno scripting language che opera ESCLUSIVAMENTE all’interno diun WEB browser (tipicamente Netscape o InternetExplorer). E’ utilizzato peraggiungere funzionalita’ dinamiche alle pagine WEB, come ad esempio verificare lavalidita’ dei campi di input di un form prima che questo venga spedito al server.Questo risparmia al server di verificare la validita’ dei dati in arrivo da centinaiadi clients, demandando ad essi tutta la computazionalita’ necessaria.

Page 6: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

6

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Es: shell script kumac Tcl/Tk JavaScript . . . . . . .

Tutti gli esempi indicati sono legati all’ambiente particolare per i quali erano statiprogettati:Tutti gli esempi indicati sono legati all’ambiente particolare per i quali erano statiprogettati:

PERL, al contrario, e’ quasi totalmente portabile e general-purpose.• E’ universalmente disponibile in rete ed e’ gratuito.gratuito.• E’ aperto (esistono i sorgenti)• E’ supportato e sviluppato da una vastissima comunita’• Esistono ricche librerie di moduli liberamente disponibili in rete come pure vastissima e’ la documentazione disponibile

PERL, al contrario, e’ quasi totalmente portabile e general-purpose.• E’ universalmente disponibile in rete ed e’ gratuito.gratuito.• E’ aperto (esistono i sorgenti)• E’ supportato e sviluppato da una vastissima comunita’• Esistono ricche librerie di moduli liberamente disponibili in rete come pure vastissima e’ la documentazione disponibile

Page 7: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

7

Kumac: scripting language di PAW (Physics Analysis Workstation)Kumac: scripting language di PAW (Physics Analysis Workstation)

PAW> fun1 1 sin(x)/x 100 -20 20

unix> paw

Identifier (Id)Identifier (Id)

Numero di punti (bins)Numero di punti (bins)

LimitiLimiti

Page 8: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

8

Kumac: scripting language di PAW (Physics Analysis Workstation)Kumac: scripting language di PAW (Physics Analysis Workstation)

PAW> fun1 1 sin(x)/x 100 -20 20

unix> paw

PAW> fun2 2 sin(x)/x*sin(y)/y 100 -10 10 100 -10 10

Page 9: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

9

PAW> fun1 1 sin(x)/x 100 -20 20

Kumac: scripting language di PAW (Physics Analysis Workstation)Kumac: scripting language di PAW (Physics Analysis Workstation)

PAW> his/file 10 histograms_file.his 1024 N

PAW> hrout 0

PAW> exit

PAW> close 10

unix>

unix> paw

PAW> fun2 2 sin(x)/x*sin(y)/y 100 -10 10 100 -10 10

Unita’ di I/OUnita’ di I/O Nome fileNome file Record sizeRecord size Flag: New fileFlag: New file

Salva tutti (0) gli istogrammi definitiSalva tutti (0) gli istogrammi definiti

Dopo aver definito gli istogrammisalviamoli su disco in un file:

Page 10: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

10

PAW> fun1 1 sin(x)/x 100 -20 20

Kumac: scripting language di PAW (Physics Analysis Workstation)Kumac: scripting language di PAW (Physics Analysis Workstation)

PAW> his/file 10 histograms_file.his 1024 N

PAW> hrout 0

PAW> exit

PAW> close 10

unix> ls -la *.his

unix> paw

PAW> fun2 2 sin(x)/x*sin(y)/y 100 -10 10 100 -10 10

-rw-r--r-- 1 menasce e831 21451365 Sep 8 19:43 histograms_file.his

Vogliamo ora riaprire questo file e stampare gli istogrammi in formato grafico

Page 11: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

11

unix> paw

PAW> his/file 10 histograms_file.his

PAW> his/lis

PAW> zon 2 2

PAW> his/plo 1

PAW> Palette 1

===> Directory : //PAWC 1 (1) sin(x)/x 2 (2) sin(x)/x*sin(y)/y

PAW> his/plo 2 colz

PAW> Set Ncol 50

PAW> surf 2

PAW> h/plo 2 surf4

Ripristina in memoria i dati degli istogrammileggendoli dal file precedentemente salvatoRipristina in memoria i dati degli istogrammileggendoli dal file precedentemente salvato

Page 12: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

12

Supponiamo ora di avere a disposizione 4 files di istogrammi e di voler sommare gli istogrammicon Id=15 fra loro, mettendo il risultato nell’istogramma con Id=100. Sara’ utile allo scopopreparare uno script (somma.kumac) e farlo eseguire in PAW.

Supponiamo ora di avere a disposizione 4 files di istogrammi e di voler sommare gli istogrammicon Id=15 fra loro, mettendo il risultato nell’istogramma con Id=100. Sara’ utile allo scopopreparare uno script (somma.kumac) e farlo eseguire in PAW.

Macro somma

MaxHistos = 4

Do I = 1, [MaxHistos]

EndDo

Case [I] in

EndCase

(1) File = ‘pixelreadout.his’ (2) File = ‘pixelnocharge.his’ (3) File = ‘newpixeldata.his’ (4) File = ‘pixelredesign.his’

his/fil 1 [File]

if ([I] .Eq. 1) then

else

endif

his/copy 15 100

his/oper/add 15 100 100

Predispone i cicli per ogni filePredispone i cicli per ogni file

Definisce il numero di files da considerareDefinisce il numero di files da considerare

A seconda del ciclo corrente, definisceun diverso nome di file a aprire in letturaA seconda del ciclo corrente, definisceun diverso nome di file a aprire in lettura

(1) File = ‘pixelreadout.his’ (2) File = ‘pixelnocharge.his’ (3) File = ‘newpixeldata.his’ (4) File = ‘pixelredesign.his’

Sistema poco pratico, soprattutto se i filehanno nomi non componibili con un algoritmoautomatico e sono in numero molto elevato.

Sistema poco pratico, soprattutto se i filehanno nomi non componibili con un algoritmoautomatico e sono in numero molto elevato.

Vedremo come l’uso di PERL ci faciliti nelcompito di automatizzare la scrittura degliscripts (useremo PERL come meta-linguaggio)

Vedremo come l’uso di PERL ci faciliti nelcompito di automatizzare la scrittura degliscripts (useremo PERL come meta-linguaggio)

his/plo 100

Il primo istogramma viene copiato pari pariin un nuovo istogramma con Id=100Il primo istogramma viene copiato pari pariin un nuovo istogramma con Id=100

somma.kumacsomma.kumac

Ogni nuovo istogramma viene sommato a quello con Id=100Ogni nuovo istogramma viene sommato a quello con Id=100

Page 13: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

13

Domanda:io che sono un fisico e non uno studioso di informatica, quali vantaggi possotrarre dall’uso di PERL nella mia attivita’ quotidiana?

Domanda:io che sono un fisico e non uno studioso di informatica, quali vantaggi possotrarre dall’uso di PERL nella mia attivita’ quotidiana?

E perche’ linguaggi come il FORTRAN o gli shell scripting possono non essere ugualmente adeguati allo scopo?

E perche’ linguaggi come il FORTRAN o gli shell scripting possono non essere ugualmente adeguati allo scopo?

Semplice da imparareSemplice da imparare La curva di apprendimento ha una derivata piccola. Si possono facilmente riciclare le conoscenze di C e di shell programming

La curva di apprendimento ha una derivata piccola. Si possono facilmente riciclare le conoscenze di C e di shell programming

Molto sofisticato e flessibileMolto sofisticato e flessibilePur essendo semplice da imparare, e’ pur sempre un linguaggio estremamente ricco di attributi e funzionalita’

Pur essendo semplice da imparare, e’ pur sempre un linguaggio estremamente ricco di attributi e funzionalita’

PortabilePortabile Questo e’ uno dei maggiori punti di forza di PERL: una volta scritto il codice, esso funzionera’ senza modifiche sul 99% delle piattaforme esistenti.

Questo e’ uno dei maggiori punti di forza di PERL: una volta scritto il codice, esso funzionera’ senza modifiche sul 99% delle piattaforme esistenti.

Ottimo collante fra processiOttimo collante fra processiPERL e’ nato per manipolare file e stringhe, ma si e’ evoluto fino a divenire un ottimo collante fra procedure eterogenee, poiche’ sa interagire col soggiacente sistema operativo in modo molto efficace.

PERL e’ nato per manipolare file e stringhe, ma si e’ evoluto fino a divenire un ottimo collante fra procedure eterogenee, poiche’ sa interagire col soggiacente sistema operativo in modo molto efficace.

E’ estremamente sinteticoE’ estremamente sintetico La sua sintassi e’ molto concisa: cio’ permette di descrivere in poche istruzioni algoritmi piuttosto complessi. Cio’ potenzialmente minimizza la possibilita’ di introdurre errori involontari nel codice

La sua sintassi e’ molto concisa: cio’ permette di descrivere in poche istruzioni algoritmi piuttosto complessi. Cio’ potenzialmente minimizza la possibilita’ di introdurre errori involontari nel codice

Page 14: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

14

E’ interpretatoE’ interpretato Pur essendo interpretato e’ piuttosto veloce inesecuzione. Inoltre ha la caratteristica di avereaccesso a run-time al proprio compilatore

Pur essendo interpretato e’ piuttosto veloce inesecuzione. Inoltre ha la caratteristica di avereaccesso a run-time al proprio compilatore

La sua velocita’ non e’ pero’ comparabile a quella di unprogramma compilato (inadatto ad applicazioni che sianocritiche nei tempi di esecuzione, tipo DAQ o real-time)

La sua velocita’ non e’ pero’ comparabile a quella di unprogramma compilato (inadatto ad applicazioni che sianocritiche nei tempi di esecuzione, tipo DAQ o real-time)

Prima di passare ad una descrizione del linguaggio PERL, vediamo se il nostro computer ha una versione installata e recente dell’interpreter. Prima di passare ad una descrizione del linguaggio PERL, vediamo se il nostro computer ha una versione installata e recente dell’interpreter.

Page 15: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

15

> which perl> which perl Fornisce il full path-name dell’eseguibile purche’ sia in uno di quelli specificati nella variabile PATHFornisce il full path-name dell’eseguibile purche’ sia in uno di quelli specificati nella variabile PATH

> whereis perl> whereis perl Cerca l’eseguibile, e le eventuali man-pages associatein tutto il tree / (root directory tree)Cerca l’eseguibile, e le eventuali man-pages associatein tutto il tree / (root directory tree)

> locate perl> locate perl Cerca in un apposito database del sistema (solo su LINUX)tutte le istanze di files contenenti la stringa perl interpretatacome regular-expression

Cerca in un apposito database del sistema (solo su LINUX)tutte le istanze di files contenenti la stringa perl interpretatacome regular-expression

> perl -v

This is perl, version 5.004_01

Copyright 1987-1997, Larry Wall

Perl may be copied only under the terms of either the ArtisticLicence or the GNU General Public Licence, which may be found inthe PERL 5.0 source kit.

> perl -w source.pl> perl -w source.pl Interpreta il file source.pl, stampa eventuali warnings dicompilazione, e lo esegueInterpreta il file source.pl, stampa eventuali warnings dicompilazione, e lo esegue

> perl -c source.pl> perl -c source.pl Interpreta il file source.pl, stampa eventuali warnings dicompilazione, ma NON lo esegueInterpreta il file source.pl, stampa eventuali warnings dicompilazione, ma NON lo esegue

Versione 5.004_01Versione 5.004_01

Page 16: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

16

test.pl test.pl

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Gli scalariGli scalari

$Number = 16;Come in C, anche in PERL un’istruzione e’ terminata dal ;Come in C, anche in PERL un’istruzione e’ terminata dal ;

$mass = 1.868 ;

$myName = “Dario Menasce” ;

$Address = “Via Celoria” ;

$FullAdd = “$myName $Address $Number.” ;

print(“ ”) ;$FullAdd\n

Dario Menasce, Via Celoria 16.

> chmod +x test.pl> perl -w test.pl

$myName$myName $Address$Address $Number$Number

Page 17: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

17

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili I vettoriI vettori

@VectorA = (1,2,3,4,5,6) ;

Il nome collettivo di un vettore e’ identificato dal simbolo @Il nome collettivo di un vettore e’ identificato dal simbolo @

@VectorB = ( ) ;“Bob”,25,$VectorA[3]

@VectorC = ( ) ;@VectorB

,(25,26,’String’)

,$VectorA[0]

Nome collettivoNome collettivo Un singolo elemento di un vettoree’ uno scalare!Un singolo elemento di un vettoree’ uno scalare!

Vediamo alcune delle operazioni utili sui vettori che e’ possibile realizzare con una singola istruzione (i fisici amano i vettori…)Vediamo alcune delle operazioni utili sui vettori che e’ possibile realizzare con una singola istruzione (i fisici amano i vettori…)

Come in C, i vettori in PERL partono da 0 !!!Come in C, i vettori in PERL partono da 0 !!!

Page 18: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

18

La sintassi di PERL (I)La sintassi di PERL (I)

@fred = (1, “ab”, $var) ;@fred = (1, “ab”, $var) ; Inizializziamo un vettore con tre elementi:Inizializziamo un vettore con tre elementi:

@barney = @fred ; Ne facciamo una copiaNe facciamo una copia

$length = @fred ; Calcoliamo il numero di elementi del vettore $length varra’ 3Calcoliamo il numero di elementi del vettore $length varra’ 3

($one) = @fred ; Estraiamo il primo elemento del vettore (equivalente a $one = $fred[0] ossia 1)

Estraiamo il primo elemento del vettore (equivalente a $one = $fred[0] ossia 1)

($a,$b,$c) = @fred ; Estraiamo i singoli elementi del vettore$a = 1, $b = “ab” e $c = $var

Estraiamo i singoli elementi del vettore$a = 1, $b = “ab” e $c = $var

($b,$a) = ($a,$b) ; Scambiamo $a con $bScambiamo $a con $b

$fred[1] = “alpha” ;

$new = $fred[0]++;

$new = $fred[1]++ ;

@fred[1,2] = @fred[2,1];

Riassegna un valore al secondo elemento del vettoreRiassegna un valore al secondo elemento del vettore

Incrementa il primo elemento del vettore (diventa 2)Incrementa il primo elemento del vettore (diventa 2)

Incrementa il secondo elemento del vettore: poiche’e’ una stringa, incrementa il valore ASCII dell’ultimocarattere della stringa (diventa ac)

Incrementa il secondo elemento del vettore: poiche’e’ una stringa, incrementa il valore ASCII dell’ultimocarattere della stringa (diventa ac)

Scambia fra loro il secondo e terzo elemento del vettore (operando su slices del vettore)

Scambia fra loro il secondo e terzo elemento del vettore (operando su slices del vettore)

$fred[2] += 4 ; Restituisce l’indice dell’ ultimo elemento del vettore (in questo caso 2)

Restituisce l’indice dell’ ultimo elemento del vettore (in questo caso 2)

Page 19: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

19

La sintassi di PERL (II)La sintassi di PERL (II)

@fred = (1, “ab”, $var) ;@fred = (1, “ab”, $var) ; Inizializziamo un vettore con tre elementi:Inizializziamo un vettore con tre elementi:

$last = $fred[-1] ; Restituisce l’ultimo elemento del vettore ($var)Restituisce l’ultimo elemento del vettore ($var)

$lastind = @#fred ; Restituisce l’indice dell’ ultimo elemento del vettore (in questo caso 2)

Restituisce l’indice dell’ ultimo elemento del vettore (in questo caso 2)

$fred[8] = “$pippo” ; Aumenta la dimensione del vettore a 9 elementidefinendo l’ultimo: gli elementi [4],[5],[6],[7]avranno valore undef

Aumenta la dimensione del vettore a 9 elementidefinendo l’ultimo: gli elementi [4],[5],[6],[7]avranno valore undef

$fred[1] .= “cd” ; Concatena al secondo elemento del vettore la stringa“cd” (si ottiene “abcd”)

Concatena al secondo elemento del vettore la stringa“cd” (si ottiene “abcd”)

Page 20: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

20

La sintassi di PERLLa sintassi di PERL

Sono possibili manipolazioni arbitrariamente complesse sugli elementidi un vettore (il confronto con il FORTRAN diverra’ evidente)Sono possibili manipolazioni arbitrariamente complesse sugli elementidi un vettore (il confronto con il FORTRAN diverra’ evidente)

@fred = (“sette”, “otto”, “nove”) ; Inizializzo un vettore a tre elementi contenenti ognuno una stringa di caratteri

Inizializzo un vettore a tre elementi contenenti ognuno una stringa di caratteri

@ord = (2, 1, 0 ) ;

Inizializzo un secondo vettore a tre elementi contenente tre numeri che rappresentano l’ordine con cui voglioriassemblare il primo vettore

Inizializzo un secondo vettore a tre elementi contenente tre numeri che rappresentano l’ordine con cui voglioriassemblare il primo vettore

@back = @fred( ) ;@ord

Cio’ e’ equivalente a:Cio’ e’ equivalente a:

@back = @fred(2, 1, 0) ;

@back = ($fred[2], $fred[1], $fred[0]) ;

Che e’ a sua volta equivalente a:Che e’ a sua volta equivalente a:

@back = (“nove”, “otto”, “sette”) ;

Vediamo come fare per invertire l’ordine degli elementi di questo vettore:Vediamo come fare per invertire l’ordine degli elementi di questo vettore:

Page 21: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

21

La sintassi di PERLLa sintassi di PERL

Ai vettori e’ associato un ricco assortimento di operatori capaci di agire su di essi in modo sintetico. Vediamone alcuni:

Ai vettori e’ associato un ricco assortimento di operatori capaci di agire su di essi in modo sintetico. Vediamone alcuni:

Gli operatori di stacking:Gli operatori di stacking: push, pop, shift and unshiftpush, pop, shift and unshift

@mylist = (1, “two”, “three”) ;$newvalue = 4 ;push @mylist, $newvalue ; print( “mylist = @mylist\n” ) ;

mylist = 1 two three 4

print( “mylist = @mylist\n” ) ;

mylist = 1 two three 4

Stack Stack

1 1 $mylist[0]$mylist[0]

two two $mylist[1]$mylist[1]

threethree$mylist[2]$mylist[2]

4 4 $mylist[3]$mylist[3]push estende la dimensione del vettore e aggiunge l’ultimo elemento in coda push estende la dimensione del vettore e aggiunge l’ultimo elemento in coda

Page 22: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

22

La sintassi di PERLLa sintassi di PERL

Gli operatori di stacking:Gli operatori di stacking: push, pop, shift and unshiftpush, pop, shift and unshift

$lastadded = pop( @mylist ) ;

print( “Last added = $lastadded\n” ) ;

Last added = 4

print( “Last added = $lastadded\n” ) ;

Last added = 4

1 1 $mylist[0]$mylist[0]

two two $mylist[1]$mylist[1]

threethree$mylist[2]$mylist[2]

4 4 $mylist[3]$mylist[3]pop rimuove l’ultimo elemento dello stack(la gestione degli indici e’ a carico di pop) pop rimuove l’ultimo elemento dello stack(la gestione degli indici e’ a carico di pop)

Page 23: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

23

La sintassi di PERLLa sintassi di PERL

Gli operatori di stacking:Gli operatori di stacking: push, pop, shift and unshiftpush, pop, shift and unshift

$mylist = (1,”two”,”three”) ;unshift( @mylist, “zero” ) ;

print( “mylist = @mylist\n” ) ;

mylist = zero 1 two three

print( “mylist = @mylist\n” ) ;

mylist = zero 1 two three

1 1 $mylist[0]$mylist[0]

two two $mylist[1]$mylist[1]

threethree$mylist[2]$mylist[2]

unshift agginunge un elemento al primo posto nel vettore: poiche’ rinumera glielementi, puo’ essere inefficiente per vettori molto grandi.

unshift agginunge un elemento al primo posto nel vettore: poiche’ rinumera glielementi, puo’ essere inefficiente per vettori molto grandi.

zero zero $mylist[0]$mylist[0]

1 1 $mylist[1]$mylist[1]

two two $mylist[2]$mylist[2]

threethree$mylist[3]$mylist[3]

Page 24: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

24

La sintassi di PERLLa sintassi di PERL

Gli operatori di stacking:Gli operatori di stacking: push, pop, shift and unshiftpush, pop, shift and unshift

$out = shift( @mylist) ;

print( “Taken out = $out\n” ) ;

Taken out = zero

print( “Taken out = $out\n” ) ;

Taken out = zero

1 1 $mylist[0]$mylist[0]

two two $mylist[1]$mylist[1]

threethree$mylist[2]$mylist[2]

shift rimuove il primo elemento dello stack: di nuovo, viene rinumerato tutto ilvettore.

shift rimuove il primo elemento dello stack: di nuovo, viene rinumerato tutto ilvettore.

zero zero $mylist[0]$mylist[0]

1 1 $mylist[1]$mylist[1]

two two $mylist[2]$mylist[2]

threethree$mylist[3]$mylist[3]

Page 25: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

25

La sintassi di PERLLa sintassi di PERL

Gli operatori di ordinamento e sorting:Gli operatori di ordinamento e sorting:

@dritto = (1, 2, 3, 4) ;@rovescio = reverse( @dritto ) ; print(“@rovescio\n”) ;

4 3 2 1

print(“@rovescio\n”) ;

4 3 2 1

@sparso = (“gamma”, “beta”, “alfa” ) ;@ordinato = sort (@sparso) ; print(“@ordinato\n”) ;

alfa beta gamma

print(“@ordinato\n”) ;

alfa beta gamma

@list = <STDIN> ;

Come faccio a riempire un vettore digitando gli elementi dalla tastiera del terminale?Come faccio a riempire un vettore digitando gli elementi dalla tastiera del terminale?

Un programma fatto da questa sola istruzione riempie ogni elemento del vettore list con una riga digitata in input. Il procedimento termina quando viene digitato un EOF (^D)

Un programma fatto da questa sola istruzione riempie ogni elemento del vettore list con una riga digitata in input. Il procedimento termina quando viene digitato un EOF (^D)

Page 26: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

26

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Le hash tablesLe hash tablesUna hash table e’ una collezione di scalari raggruppata sotto un unico nome, la cui posizione e’ identificata, invece che da un numero intero positivo, come accade nel caso dei vettori, da una arbitraria stringa di caratteri.

Una hash table e’ una collezione di scalari raggruppata sotto un unico nome, la cui posizione e’ identificata, invece che da un numero intero positivo, come accade nel caso dei vettori, da una arbitraria stringa di caratteri.

$sede{“Dario Menasce”} = “Milano” ;$sede{“$utente”} = “Torino” ; Questa sintassi e’ equivalente a:Questa sintassi e’ equivalente a:

%sede{ “Dario Menasce” => “Milano” , “$utente” => “Torino” } ;

Ed e’ anche equivalente a:Ed e’ anche equivalente a:

%sede = (“Dario Menasce”, “Milano”, $utente, “Torino” } ;

ChiaveChiave ValoreValore

@lista = %sede ; Una hash puo’ essere trasformata in una lista...Una hash puo’ essere trasformata in una lista...

%nuovasede = @lista ; … e viceversa… e viceversa

ChiaveChiave ValoreValore

ChiaveChiave ValoreValore ChiaveChiave ValoreValore

Page 27: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

27

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Le hash tablesLe hash tables

Le hash sono le strutture dati native di PERL dotate della maggior versatilita’per la costruzione di strutture piu’ complesse, come hash di hash ecc…

Le hash sono le strutture dati native di PERL dotate della maggior versatilita’per la costruzione di strutture piu’ complesse, come hash di hash ecc…

$Address{ } = “$FirstName-$LastName” “$City ” ;.“$Street{$Employee}”

$Employee = “$FirstName $LastName” ;$City = “Milano” ;

$FirstName = “Dario” ;

$Street{“Dario Menasce” = “Via Celoria 16” ;

$LastName = “Menasce” ;

print(“Address of $FirstName-$LastName: $Address{$FirstName-$LastName} \n” ) ;

Address of Dario Menasce: via Celoria 16 Milano

$Street{“Daniele Pedrini” = “Piazza Duomo 2” ;

Page 28: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

28

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Gli operatori sulle hash tablesGli operatori sulle hash tables L’operatore eachL’operatore each

$Hash{“alpha”} = “a” ;$Hash{“beta”} = “b” ;$Hash{“rho”} = “r” ;$Hash{“pi”} = “p” ;

while ( ) { print (“ \n”) ;}

each(%Hash)=($greek,$latin)La lettera greca $greek corrisponde alla latina $latin

La lettera greca pi corrisponde alla latina pLa lettera greca rho corrisponde alla latina rLa lettera greca beta corrisponde alla latina bLa lettera greca alpha corrisponde alla latina a

La lettera greca pi corrisponde alla latina pLa lettera greca rho corrisponde alla latina rLa lettera greca beta corrisponde alla latina bLa lettera greca alpha corrisponde alla latina a

L’operatore each restituisce, in un contesto vettoriale, tutte le coppie chiave/valore definite per la hash in questione

L’operatore each restituisce, in un contesto vettoriale, tutte le coppie chiave/valore definite per la hash in questione

Page 29: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

29

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Gli operatori sulle hash tablesGli operatori sulle hash tables L’operatore keysL’operatore keys

$Hash{“alpha”} = “a” ;$Hash{“beta”} = “b” ;$Hash{“rho”} = “r” ;$Hash{“pi”} = “p” ;

@List = keys ( %Hash ) ;print (“@List\n”) ;

pi rho beta alphaL’ordine non e’ quello di inserimento, bensi’ quello determinato dall’algoritmo di hashing. Se vogliamo una lista ordinata alfabeticamente useremo l’operatore sort

L’ordine non e’ quello di inserimento, bensi’ quello determinato dall’algoritmo di hashing. Se vogliamo una lista ordinata alfabeticamente useremo l’operatore sort@List = sort keys ( %Hash ) ;

print (“@List\n”) ;

alpha beta pi rho L’operatore values agisce sui valori della hash in modo analogo:L’operatore values agisce sui valori della hash in modo analogo:

@List = sort values ( %Hash ) ;print (“@List\n”) ;

a b p r

Page 30: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

30

La sintassi di PERLLa sintassi di PERL

I tipi di variabiliI tipi di variabili Gli operatori sulle hash tablesGli operatori sulle hash tables Esistono innumerevoli modi per assegnare elementi ad una hashEsistono innumerevoli modi per assegnare elementi ad una hash

$record{“Fred”} = 205 ;$record{“Barney”} = 195 ;$record{“Wilma”} = 30 ;

@record{“Fred”, “Barney”, “Wilma”} = (205, 195, 30) ;

Ad ogni personaggio associamo il suo record personale a bowling...

Ad ogni personaggio associamo il suo record personale a bowling...

@Vincitori = {“Fred”, “Barney”, “Dino”} ;@Valori = (205, 195, 30) ;@record( ) = ;

Queste due forme di assegnazione sono completamente equivalenti

Queste due forme di assegnazione sono completamente equivalenti

Un altro modo ancora...Un altro modo ancora...

@Vincitori @Valori Indipendentemente da come @record viene assegnato...

Indipendentemente da come @record viene assegnato...

while (($persona, $valore) = each %record) { print(“Il record di $persona e’ $valore\n” ) ;}

Il record di Barney e’ 195Il record di Fred e’ 205Il record di Wilma e’ 30

Il record di Barney e’ 195Il record di Fred e’ 205Il record di Wilma e’ 30

Page 31: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

31

La sintassi di PERLLa sintassi di PERL

Le strutture di controlloLe strutture di controllo Analoghe a quelle di molti linguaggi (tipo C)Analoghe a quelle di molti linguaggi (tipo C)

if (condition1) {

block1 ;

} elsif (condition2) {

block2 ;

} else {

block3 ;

}

if (condition1) {

block1 ;

} elsif (condition2) {

block2 ;

} else {

block3 ;

}

unless (condition) {

block ;

}

unless (condition) {

block ;

}

while (condition) {

block ;

}

while (condition) {

block ;

}

until (condition) {

block ;

}

until (condition) {

block ;

}

do {

block ;

} while (condition);

do {

block ;

} while (condition);

do {

block ;

} until (condition);

do {

block ;

} until (condition);

Qualsiasi espressione che, una volta valutata, dia un valore diverso da zeroQualsiasi espressione che, una volta valutata, dia un valore diverso da zero

In questo caso, prima viene eseguito il blocco di istruzioni block, poi viene valutata la condizione condition per eventualmente reiterare il blocco

In questo caso, prima viene eseguito il blocco di istruzioni block, poi viene valutata la condizione condition per eventualmente reiterare il blocco

for(init;test;incr){

block ;

}

for(init;test;incr){

block ;

}

foreach $i (@list) {

block ;

}

foreach $i (@list) {

block ;

}

Page 32: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

32

open (IN, “myfile.dat”) ;

while ( <IN>) {

print ;

}

close(IN) ;

open (IN, “myfile.dat”) ;

while ( <IN>) {

print ;

}

close(IN) ;

La sintassi di PERLLa sintassi di PERL

Operazioni di I/OOperazioni di I/O

Un filehandle e’ il nome dato ad una connessione fra il corrente processo di PERL ed il mondo esterno: e’quindi un canale di I/O con il soggiacente sistemaoperativo, analogo alla UNIT del FORTRAN

Un filehandle e’ il nome dato ad una connessione fra il corrente processo di PERL ed il mondo esterno: e’quindi un canale di I/O con il soggiacente sistemaoperativo, analogo alla UNIT del FORTRAN

$_=

(“$_\n”)

Il concetto di file-handleIl concetto di file-handle

La sintassi estremamente concisa di PERL permette di omettere in molti casi il nome di una variabile specifica:il $_ e’ una variabile implicita di PERL

La sintassi estremamente concisa di PERL permette di omettere in molti casi il nome di una variabile specifica:il $_ e’ una variabile implicita di PERL

Questo script si comporta in modoidentico al comando UNIX cat myfile.dat

Questo script si comporta in modoidentico al comando UNIX cat myfile.dat

Page 33: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

33

La sintassi di PERLLa sintassi di PERL

Operazioni di I/OOperazioni di I/O Il concetto di file-handle (cont..)Il concetto di file-handle (cont..)

open ( LOG, “ myfile.dat” ) ;

print LOG (“Process $proc has completed \n” );

close( LOG ) ;

open ( LOG, “ myfile.dat” ) ;

print LOG (“Process $proc has completed \n” );

close( LOG ) ;

>

Ridirige ogni output a LOG verso il file myfile.dat, analogamente a quanto avviene in UNIX con > o >>Ridirige ogni output a LOG verso il file myfile.dat, analogamente a quanto avviene in UNIX con > o >>

|| die “Cannot open file myfile.dat”

$file = “myfile.dat” ;if (-e “$file”) { print(“File $file alredy exists!\n”) ;}

$file = “myfile.dat” ;if (-e “$file”) { print(“File $file alredy exists!\n”) ;}

Se la condizione alla destra del simbolo di or, ||, e’ falsa, ossia se il file non puo’ essere aperto, il programma muore producendo la frase indicata a destra

Se la condizione alla destra del simbolo di or, ||, e’ falsa, ossia se il file non puo’ essere aperto, il programma muore producendo la frase indicata a destra

Esiste una ricca serie di qualificatori capaci di restituire informazioni circa un file; il loro uso e’ molto semplice:

Esiste una ricca serie di qualificatori capaci di restituire informazioni circa un file; il loro uso e’ molto semplice:

Page 34: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

34

La sintassi di PERLLa sintassi di PERL

Operazioni di I/OOperazioni di I/O Il concetto di file-globbingIl concetto di file-globbing

Come faccio a mettere in un vettore la listadei files di una directory che iniziano con lastringa host seguito da qualsiasi carattere?

Come faccio a mettere in un vettore la listadei files di una directory che iniziano con lastringa host seguito da qualsiasi carattere?

@list = < > ;/etc/host*

Con una sola istruzione otteniamo i seguenti risultati:

• con gli operatori < e > abbiamo aperto un canale di I/O• con la wild-card * specifichiamo un intero range di nomi• l’output dell’operatore < > consiste in una lista di oggetti e viene quindi valutato in un contesto vettoriale: di conseguenza ogni oggetto viene inserito in un elemento del vettore list

Con una sola istruzione otteniamo i seguenti risultati:

• con gli operatori < e > abbiamo aperto un canale di I/O• con la wild-card * specifichiamo un intero range di nomi• l’output dell’operatore < > consiste in una lista di oggetti e viene quindi valutato in un contesto vettoriale: di conseguenza ogni oggetto viene inserito in un elemento del vettore list

foreach $file (@list) { print (“$file”) ; }

In modo ancora piu’ conciso:In modo ancora piu’ conciso:

foreach (</etc/host*>) { print ; }

Page 35: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

35

La sintassi di PERLLa sintassi di PERL

Operatori di interazione col filesystem localeOperatori di interazione col filesystem locale

Un altro punto di forza di PERL e’ la sua portabilita’ : questa e’ realizzatacreando un’abstraction layer tra la funzionalita’ e l’ implementazione di uncomando diretto al sistema operativo. Vediamo alcuni esempi utili:

Un altro punto di forza di PERL e’ la sua portabilita’ : questa e’ realizzatacreando un’abstraction layer tra la funzionalita’ e l’ implementazione di uncomando diretto al sistema operativo. Vediamo alcuni esempi utili:

unlink (“myfile.dat”) ; rm myfile.dat

rename (“myfile.dat myfile.old”) ; mv myfile.dat myfile.old

link (“fred barney”) ; ln fred barney

symlink (“fred barney”) ; ln -s fred barney

mkdir (“newdir”, 0755) ; mkdir newdir; chmod 755 newdir

Ecc… ecc...Ecc… ecc...

Equivale a...Equivale a...

Page 36: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

36

Controllo di processiControllo di processi

E’ frequente la necessita’ di interagire con il sistema operativo dall’interno di un processo,sia per ricevere informazioni che per far partire e gestire processi esterni. Vediamo quali strumenti offre PERL per risolvere questo problema assieme a qualche utile esempio.

E’ frequente la necessita’ di interagire con il sistema operativo dall’interno di un processo,sia per ricevere informazioni che per far partire e gestire processi esterni. Vediamo quali strumenti offre PERL per risolvere questo problema assieme a qualche utile esempio.

In quasi tutti i linguaggi di programmazione e’ possibile fornire dei comandi al soggiacente sistema operativo: cio’ e’ utile per diversi motivi:

In quasi tutti i linguaggi di programmazione e’ possibile fornire dei comandi al soggiacente sistema operativo: cio’ e’ utile per diversi motivi:

Quando occorre eseguire un’operazione per la quale esiste un opportuno comando di sistema che non sivuole reinventare, come ad esempio il comando di stampa di un file, lpr, o il comando di cancellazione file

Quando occorre eseguire un’operazione per la quale esiste un opportuno comando di sistema che non sivuole reinventare, come ad esempio il comando di stampa di un file, lpr, o il comando di cancellazione file

Page 37: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

37

Controllo di processiControllo di processi

Il metodo piu’ semplice e’ l’uso della funzione system:Il metodo piu’ semplice e’ l’uso della funzione system:

system(“ “) ; comando

comando al sistema operativocomando al sistema operativo

ls -la *.txt

L’eventuale output prodotto dal comando viene passato allo STANDARD OUTPUTdel processo padre (PERL), assieme allo STANDARD ERROR (si dice che il figlio eredita STDIN, STDOUT e STDERR dal processo padre)

L’eventuale output prodotto dal comando viene passato allo STANDARD OUTPUTdel processo padre (PERL), assieme allo STANDARD ERROR (si dice che il figlio eredita STDIN, STDOUT e STDERR dal processo padre)

system(“montecarlo.exe &”) ;

In questo caso viene fatto partire il processo montecarlo.exe ma non si aspetta che esso abbia termine per far tornare il controllo al processopadre. L’uso e’ problematico nel caso il figlio generi dell’output , poiche’ questo verra’ mescolatoin modo asincrono con quello del padre.

In questo caso viene fatto partire il processo montecarlo.exe ma non si aspetta che esso abbia termine per far tornare il controllo al processopadre. L’uso e’ problematico nel caso il figlio generi dell’output , poiche’ questo verra’ mescolatoin modo asincrono con quello del padre.

foreach $key ( ) { print(“$key=$ENV{$key}\n”) ; }

%ENVkeyssort

PERL mi fornisce anche lo strumento per avere accesso alle variabili ambientali del sistema operativo:

PERL mi fornisce anche lo strumento per avere accesso alle variabili ambientali del sistema operativo:

System e’ utile, ma l’output generato dal comando eseguito dal sistemaoperativo, una volta mandato allo STDOUT, e’ perso, non possiamo usarloall’interno dello script PERL che lo ha lanciato!!!.

System e’ utile, ma l’output generato dal comando eseguito dal sistemaoperativo, una volta mandato allo STDOUT, e’ perso, non possiamo usarloall’interno dello script PERL che lo ha lanciato!!!.

In seguito all chiamata a system, PERL procede alla creazione (forking) di un sottoprocesso, detto processo figlio (child process), nell’ambito del quale viene eseguito il comando specificato (il comando viene passato alla shell sh).

In seguito all chiamata a system, PERL procede alla creazione (forking) di un sottoprocesso, detto processo figlio (child process), nell’ambito del quale viene eseguito il comando specificato (il comando viene passato alla shell sh).

Queste istruzioni sono assolutamenteequivalenti al comando printenv

Queste istruzioni sono assolutamenteequivalenti al comando printenv

Page 38: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

38

Controllo di processiControllo di processi

L’operatore backticks (`): un primo modo per catturare l’output di un processo di sistemaL’operatore backticks (`): un primo modo per catturare l’output di un processo di sistema

$now = “Current date is “ ;. ` `

Backticks...Backticks...

date

print(“$now\n”) ;

Dalla shell, il comando date produce il seguente output:

Fri Nov 6 15:00:12 MET 1998

Dalla shell, il comando date produce il seguente output:

Fri Nov 6 15:00:12 MET 1998

Current date is Fri Nov 6 15:00:12 MET 1998

In questo caso, date produce una sola linea di output, e quindi i backticks vengonovalutati in un contesto scalare ed il risultato posto in una variabile scalare.In questo caso, date produce una sola linea di output, e quindi i backticks vengonovalutati in un contesto scalare ed il risultato posto in una variabile scalare.

@ListOfConnectedPeople = `who` ;

Il comando who genera un output con diverse linee, una per ogni utente: l’output vienequindi valutato in un contesto vettoriale, ed ogni linea verra’ memorizzata in un elementodel vettore @ListOfConnectedPeople

Il comando who genera un output con diverse linee, una per ogni utente: l’output vienequindi valutato in un contesto vettoriale, ed ogni linea verra’ memorizzata in un elementodel vettore @ListOfConnectedPeople

Page 39: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

39

Controllo di processiControllo di processi

Un modo ancora piu’ flessibile e’ dato dall’operatore open associato ad una pipeUn modo ancora piu’ flessibile e’ dato dall’operatore open associato ad una pipe

open( , “who “) ;CHI

Il nome di un file-handle: esso conterra’ il canale di I/O associatoall’output prodotto dal comando who. Occorre specificare che whodeve ridirigere l’output ad una pipe, ossia allo script corrente, ossia...

Il nome di un file-handle: esso conterra’ il canale di I/O associatoall’output prodotto dal comando who. Occorre specificare che whodeve ridirigere l’output ad una pipe, ossia allo script corrente, ossia...

|

Occorre terminare il comando con il simbolo di pipe !!!

Occorre terminare il comando con il simbolo di pipe !!!

while (<CHI>) {

print ;

} close(CHI) ;

Qui’ c’e’ un semplice print: in realta’ possiamo manipolare ogni riga di output di who agendo sulla variabile $_ .

Qui’ c’e’ un semplice print: in realta’ possiamo manipolare ogni riga di output di who agendo sulla variabile $_ .

E se volessimo mandare l’output, eventualmente modificato,direttamente ad una stampantelaser? Facile...

E se volessimo mandare l’output, eventualmente modificato,direttamente ad una stampantelaser? Facile...

open( OUT, “ lpr -Pps_hplit3” ) ; Apriamo un altro canale di I/O sul quale manderemo il comando di stampa...

Apriamo un altro canale di I/O sul quale manderemo il comando di stampa...|

OUT

Il comando di print OUT spedisce cio’ che who ha prodotto alla pipe OUT, ossia al comando lpr e quindi alla stampante!!

Il comando di print OUT spedisce cio’ che who ha prodotto alla pipe OUT, ossia al comando lpr e quindi alla stampante!!

Per mandare degli argomenti ad una pipe, occorre farprecedere il comando per il sistema operativo dal simbolo di pipe!!!

Per mandare degli argomenti ad una pipe, occorre farprecedere il comando per il sistema operativo dal simbolo di pipe!!!

Page 40: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

40

La capacita’ di PERL di interagire con il sistema operativo, nel modo visto dagli esempi precedenti e’ uno dei motivi che hanno reso PERL cosi’ popolareLa capacita’ di PERL di interagire con il sistema operativo, nel modo visto dagli esempi precedenti e’ uno dei motivi che hanno reso PERL cosi’ popolare

Una caratteristica interessante di PERL, e’ la capacita’ di eseguire una stringa di caratteri, interpretandola come un blocco di istruzioni. La stringapuo’ essere composta leggendo dati dall’esterno del programma: diviene allorapossibile scrivere oggetti di estrema generalita’ come pocket-calculators esimili. Cio’ e’ possibile grazie al fatto che il linguaggio PERL ha accesso alproprio interpreter, al quale puo’ fornire ulteriori parti di programma compostea run-time, dopo che una prima parte del programma e’ gia’ stata compilata ed eseguita...

Una caratteristica interessante di PERL, e’ la capacita’ di eseguire una stringa di caratteri, interpretandola come un blocco di istruzioni. La stringapuo’ essere composta leggendo dati dall’esterno del programma: diviene allorapossibile scrivere oggetti di estrema generalita’ come pocket-calculators esimili. Cio’ e’ possibile grazie al fatto che il linguaggio PERL ha accesso alproprio interpreter, al quale puo’ fornire ulteriori parti di programma compostea run-time, dopo che una prima parte del programma e’ gia’ stata compilata ed eseguita...

Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input un’arbitraria serie di istruzioni e le esegua.Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input un’arbitraria serie di istruzioni e le esegua.

Page 41: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

41

Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input un’arbitraria serie di istruzioni e le esegua.Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input un’arbitraria serie di istruzioni e le esegua.

while(1) { print(“> “) ; $result = eval <STDIN> ; print(“$result\n”) ;}

while(1) { print(“> “) ; $result = eval <STDIN> ; print(“$result\n”) ;}

Stampa il prompt > sul terminaleStampa il prompt > sul terminale

Cio’ che viene dato in input dal terminale viene valutato interpretandolo come espressione in PERL ed il risultato della medesima viene posto nella variabile $result che puo’ essere stampata

Cio’ che viene dato in input dal terminale viene valutato interpretandolo come espressione in PERL ed il risultato della medesima viene posto nella variabile $result che puo’ essere stampata

La variabile $result viene infine stampata sullo STDOUT

La variabile $result viene infine stampata sullo STDOUT

Eseguiamo ora il programma dando il seguente input:

Eseguiamo ora il programma dando il seguente input:

> $E=sqrt($M**2+$p**2);$px=12.34; $py=11.34;$pz=123.12; $M=1.869;$p=sqrt($px**2+$py**2+$pz**2);

RETURNRETURN

124.269460290934

>Torna il prompt: qualunque altro tipo di calcolo diamo in pasto al programma esso sara’ in grado di eseguirlo e darci il risultato!!!!

Torna il prompt: qualunque altro tipo di calcolo diamo in pasto al programma esso sara’ in grado di eseguirlo e darci il risultato!!!!

$a=3; $ b=4; $c = sqrt($a**2 + $b**2 ) ;

5

> print(“ \n” ) ;sqrt($a**2 + $b**2 ) = $c

sqrt(3**2 + 4**2) = 5

1

La funzione print di PERL restituisce 1, valoreche viene mandato allo STDOUT subito dopo la stringa che print doveva stampare...

La funzione print di PERL restituisce 1, valoreche viene mandato allo STDOUT subito dopo la stringa che print doveva stampare...

Questo semplicissimo programma non solo funge da pocket-calculator, ma e’ in gradodi eseguire qualsiasi parte di un un programma in PERL che gli venga fornito in input!!!!

Questo semplicissimo programma non solo funge da pocket-calculator, ma e’ in gradodi eseguire qualsiasi parte di un un programma in PERL che gli venga fornito in input!!!!

$a=3; $ b=4; $c = sqrt($a**2 + $b**2 ) ;

Poiche’ 1 e’ costante, questo loop e’ infinito: lo interrompero’ con ^C

Poiche’ 1 e’ costante, questo loop e’ infinito: lo interrompero’ con ^C

Page 42: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

42

Un altro importante utilizzo di eval riguarda il cosiddetto error-trapping (detto anche exception- handling)Un altro importante utilizzo di eval riguarda il cosiddetto error-trapping (detto anche exception- handling)

$a = 14 ;print(“Enter denominator: “ ) ;$b = <STDIN> ;$r = eval { } ;

Blocco di istruzioni potenzialmente capacidi generare un errore

Blocco di istruzioni potenzialmente capacidi generare un errore

$c = $a / $bIn caso di divisione per zero viene generato un errore:in quel caso PERL riempie la variabile implicita $@ con la stringa di caratteri che descrive il tipo di errore generato, in questo caso Illegal division by zero

In caso di divisione per zero viene generato un errore:in quel caso PERL riempie la variabile implicita $@ con la stringa di caratteri che descrive il tipo di errore generato, in questo caso Illegal division by zero

if ($@ =~ /Illegal/) { print(“Fatal!… $@”) ;} else { print(“Result: $r\n”) ;}

Enter denominator: 0

Fatal!… Illegal division by zero at esempio_0_1.pl line 4.

Enter denominator: 7

Result: 2

Page 43: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

43

Le regular expressions in PERLLe regular expressions in PERL

Una regular expression non e’ altro che un modo sintetico per descrivere un particolare pattern di caratteri, spesso mediante l’uso di meta-characters: nel caso di PERL e’ quasi un meta-linguaggio, dotato di proprieta’ complesse.

Una regular expression non e’ altro che un modo sintetico per descrivere un particolare pattern di caratteri, spesso mediante l’uso di meta-characters: nel caso di PERL e’ quasi un meta-linguaggio, dotato di proprieta’ complesse.

Uno dei problemi piu’ difficili e comuni da risolvere nella automazione di procedure complesse e’ quella del riconoscimento di pattern di caratteri: lo strumento principe per risolvere questa categoria di problemi e’ l’uso delle regular expression, strumento disponibile in diverse famiglie di linguaggi

Uno dei problemi piu’ difficili e comuni da risolvere nella automazione di procedure complesse e’ quella del riconoscimento di pattern di caratteri: lo strumento principe per risolvere questa categoria di problemi e’ l’uso delle regular expression, strumento disponibile in diverse famiglie di linguaggi

L’esempio piu’ semplice di regular expression e’ la wild-card (il simbolo *), spesso usato in congiunzioneal comando ls di UNIX: essa rappresenta in modo astratto il concetto “qualunque insieme di caratteri”

L’esempio piu’ semplice di regular expression e’ la wild-card (il simbolo *), spesso usato in congiunzioneal comando ls di UNIX: essa rappresenta in modo astratto il concetto “qualunque insieme di caratteri”

Vediamo un esmpio articolato, per risolvere il quale l’uso di una regular expression si dimostri particolarmente efficaceVediamo un esmpio articolato, per risolvere il quale l’uso di una regular expression si dimostri particolarmente efficace

Page 44: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

44

-rw-r--r-- 1 menasce e831 202 Nov 25 1997 drve831_threepi.runsts-rwxr-xr-x 1 menasce e831 524 Nov 21 1997 mcfocus_threepi.csh-rw-r----- 1 menasce e831 64010 Nov 9 1997 mcfocus_threepi.log-rw-r--r-- 1 menasce e831 2485 Nov 14 1997 mcfocus_threepi.make-rw-r--r-- 1 menasce e831 222 Nov 9 1997 mcfocus_threepi.mcf-rw-r--r-- 1 menasce e831 2193 Nov 19 1997 mcfocus_threepi.nam-rw-r----- 1 menasce e831 2864 Nov 9 1997 mcfocus_threepi.out_dat-rw-r--r-- 1 menasce e831 70 Nov 21 1997 mcfocus_threepi.paw-rwxr-x--x 1 menasce e831 2002 Sep 15 1997 mcfocus_threepi.run-rw-r--r-- 1 menasce e831 742 Apr 14 1998 mcfocus_threepi.sf-rw-r--r-- 1 menasce e831 460 Nov 20 1997 new_threepi_mc.txt-rw-r--r-- 1 menasce e831 15793 Nov 21 1997 new_threepi_PAW_mc.txt-rw-r--r-- 1 menasce e831 2360 Jul 16 1997 threepi.kumac-rw-r--r-- 1 menasce e831 753 Jul 16 1997 threepi_match.kumac-rw-r--r-- 1 menasce e831 3710 Jul 16 1997 threepi_res.ftn-rw-r--r-- 1 menasce e831 257 Jul 16 1997 threepi_res.kumac-rw-r--r-- 1 menasce e831 47331 Nov 25 1997 ugly_threepi.sf-rw-r--r-- 1 menasce e831 384 Jul 10 1997 under_threepi.sf-rw-r--r-- 1 menasce e831 5051 Nov 9 1997 usrinit_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrmisc_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrpack_threepi.sf-rw-r--r-- 1 menasce e831 484 Nov 9 1997 usrstop_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrunpk_threepi.sf

> ls -la *three*

> ls -la *three* | grep -v mc

-rw-r--r-- 1 menasce e831 202 Nov 25 1997 drve831_threepi.runsts-rwxr-xr-x 1 menasce e831 524 Nov 21 1997 mcfocus_threepi.csh-rw-r----- 1 menasce e831 64010 Nov 9 1997 mcfocus_threepi.log-rw-r--r-- 1 menasce e831 2485 Nov 14 1997 mcfocus_threepi.make-rw-r--r-- 1 menasce e831 222 Nov 9 1997 mcfocus_threepi.mcf-rw-r--r-- 1 menasce e831 2193 Nov 19 1997 mcfocus_threepi.nam-rw-r----- 1 menasce e831 2864 Nov 9 1997 mcfocus_threepi.out_dat-rw-r--r-- 1 menasce e831 70 Nov 21 1997 mcfocus_threepi.paw-rwxr-x--x 1 menasce e831 2002 Sep 15 1997 mcfocus_threepi.run-rw-r--r-- 1 menasce e831 742 Apr 14 1998 mcfocus_threepi.sf-rw-r--r-- 1 menasce e831 460 Nov 20 1997 new_threepi_mc.txt-rw-r--r-- 1 menasce e831 15793 Nov 21 1997 new_threepi_PAW_mc.txt-rw-r--r-- 1 menasce e831 2360 Jul 16 1997 threepi.kumac-rw-r--r-- 1 menasce e831 753 Jul 16 1997 threepi_match.kumac-rw-r--r-- 1 menasce e831 3710 Jul 16 1997 threepi_res.ftn-rw-r--r-- 1 menasce e831 257 Jul 16 1997 threepi_res.kumac-rw-r--r-- 1 menasce e831 47331 Nov 25 1997 ugly_threepi.sf-rw-r--r-- 1 menasce e831 384 Jul 10 1997 under_threepi.sf-rw-r--r-- 1 menasce e831 5051 Nov 9 1997 usrinit_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrmisc_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrpack_threepi.sf-rw-r--r-- 1 menasce e831 484 Nov 9 1997 usrstop_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrunpk_threepi.sf

-rw-r--r-- 1 menasce e831 202 Nov 25 1997 drve831_threepi.runsts-rw-r--r-- 1 menasce e831 2360 Jul 16 1997 threepi.kumac-rw-r--r-- 1 menasce e831 753 Jul 16 1997 threepi_match.kumac-rw-r--r-- 1 menasce e831 3710 Jul 16 1997 threepi_res.ftn-rw-r--r-- 1 menasce e831 257 Jul 16 1997 threepi_res.kumac-rw-r--r-- 1 menasce e831 47331 Nov 25 1997 ugly_threepi.sf-rw-r--r-- 1 menasce e831 384 Jul 10 1997 under_threepi.sf-rw-r--r-- 1 menasce e831 5051 Nov 9 1997 usrinit_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrmisc_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrpack_threepi.sf-rw-r--r-- 1 menasce e831 484 Nov 9 1997 usrstop_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrunpk_threepi.sf

> ls -la *three* | grep -v mc | grep sf

Vogliamo la lista di questi soli files(terminano tutti per sf)

Vogliamo la lista di questi soli files(terminano tutti per sf)

Pero’ non vogliamo questo file...Pero’ non vogliamo questo file...

Iniziamo con l’eliminare dalla lista quelli che contengono i caratteri mc

Iniziamo con l’eliminare dalla lista quelli che contengono i caratteri mc

A questo punto basta chiedere che compaia la coppia di caratteri sf

A questo punto basta chiedere che compaia la coppia di caratteri sf

Troppi: vogliamo selezionare solo alcunidi questi file, usando un criterio di selezione basato sulla presenza nel nome di un certo pattern di caratteri:

Troppi: vogliamo selezionare solo alcunidi questi file, usando un criterio di selezione basato sulla presenza nel nome di un certo pattern di caratteri:

-rw-r--r-- 1 menasce e831 202 Nov 25 1997 drve831_threepi.runsts-rwxr-xr-x 1 menasce e831 524 Nov 21 1997 mcfocus_threepi.csh-rw-r----- 1 menasce e831 64010 Nov 9 1997 mcfocus_threepi.log-rw-r--r-- 1 menasce e831 2485 Nov 14 1997 mcfocus_threepi.make-rw-r--r-- 1 menasce e831 222 Nov 9 1997 mcfocus_threepi.mcf-rw-r--r-- 1 menasce e831 2193 Nov 19 1997 mcfocus_threepi.nam-rw-r----- 1 menasce e831 2864 Nov 9 1997 mcfocus_threepi.out_dat-rw-r--r-- 1 menasce e831 70 Nov 21 1997 mcfocus_threepi.paw-rwxr-x--x 1 menasce e831 2002 Sep 15 1997 mcfocus_threepi.run-rw-r--r-- 1 menasce e831 742 Apr 14 1998 mcfocus_threepi.sf-rw-r--r-- 1 menasce e831 460 Nov 20 1997 new_threepi_mc.txt-rw-r--r-- 1 menasce e831 15793 Nov 21 1997 new_threepi_PAW_mc.txt-rw-r--r-- 1 menasce e831 2360 Jul 16 1997 threepi.kumac-rw-r--r-- 1 menasce e831 753 Jul 16 1997 threepi_match.kumac-rw-r--r-- 1 menasce e831 3710 Jul 16 1997 threepi_res.ftn-rw-r--r-- 1 menasce e831 257 Jul 16 1997 threepi_res.kumac-rw-r--r-- 1 menasce e831 47331 Nov 25 1997 ugly_threepi.sf-rw-r--r-- 1 menasce e831 384 Jul 10 1997 under_threepi.sf-rw-r--r-- 1 menasce e831 5051 Nov 9 1997 usrinit_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrmisc_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrpack_threepi.sf-rw-r--r-- 1 menasce e831 484 Nov 9 1997 usrstop_threepi.sf-rw-r--r-- 1 menasce e831 268 Jul 10 1997 usrunpk_threepi.sf

Risultato raggiunto, ma in un modo poco flessibile: vediamo come si puo’ ottenere lo stesso risultato utilizzando le regularexpressions in uno script PERL

Risultato raggiunto, ma in un modo poco flessibile: vediamo come si puo’ ottenere lo stesso risultato utilizzando le regularexpressions in uno script PERL

Page 45: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

45

Le regular expressions in PERLLe regular expressions in PERL

Vediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressionsVediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressions

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ;

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ; Fatto cosi’, il programma stampa la lista

di TUTTI i files della directory corrente!!

Fatto cosi’, il programma stampa la lista di TUTTI i files della directory corrente!!

print ;

Page 46: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

46

Le regular expressions in PERLLe regular expressions in PERL

Vediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressionsVediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressions

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ;

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ;

if (m/sf/) {print} ;

m sta per matchm sta per matchsf e’ una regular expression che sta per:qualsiasi coppia contigua composta da e solo da s seguito da f minuscoli

sf e’ una regular expression che sta per:qualsiasi coppia contigua composta da e solo da s seguito da f minuscoli

In realta’ a noi interessano solo i files che terminano con sf:

In realta’ a noi interessano solo i files che terminano con sf:

Aggiungiamo alla regexp sf il metacharacter $ che indica in modo sintetico il concetto di “la regexp deve terminare con”

Aggiungiamo alla regexp sf il metacharacter $ che indica in modo sintetico il concetto di “la regexp deve terminare con”

Page 47: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

47

Le regular expressions in PERLLe regular expressions in PERL

Vediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressionsVediamo come realizzare questa stessa cosa in PERL utilizzando il meccanismo delle regular expressions

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ;

#!/usr/local/bin/perl

open(PIPE, “ls -la”) ; while(PIPE) {

} close(PIPE) ;

if (m/sf$/) {print} ;

Se poi non desideriamo nella lista i file cheiniziano con mc modifichiamo ulteriormente la regexp:

if (m/sf$/ && !m/^mc/) {print} ;

Se poi non desideriamo nella lista i file cheiniziano con mc modifichiamo ulteriormente la regexp:

if (m/sf$/ && !m/^mc/) {print} ;

Simbolo di NOTSimbolo di NOT Caret: significa “inizia per”Caret: significa “inizia per”

Questo semplice esempio chiarisce molto bene il concetto di regular expression: si tratta di un modo simbolico di rappresentare un pattern di caratteri da utilizzare come filtro di selezione in una richiesta condizionale

Questo semplice esempio chiarisce molto bene il concetto di regular expression: si tratta di un modo simbolico di rappresentare un pattern di caratteri da utilizzare come filtro di selezione in una richiesta condizionale

Una regular expression: puo’ essere qualcosa di estremamente complesso e cripticoda interpretare, ma si tratta di uno strumento veramente molto potente.

Una regular expression: puo’ essere qualcosa di estremamente complesso e cripticoda interpretare, ma si tratta di uno strumento veramente molto potente.

Supponiamo di voler cercare le parole duplicate in un testo:Supponiamo di voler cercare le parole duplicate in un testo:

Page 48: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

48

Le regular expressions in PERLLe regular expressions in PERL

#!/usr/local/bin/perl while(<DATA>) {

}

#!/usr/local/bin/perl while(<DATA>) {

}

__END__

Questo testo contiene un certo certo numero di paroleduplicate. Scopo dello script di cui sopra e’ trovarlee indicare in quale paragrafo paragrafo esse si trovano

{ print ;}

Eseguendo questo programma, il testo indicato verra’ semplicemente stampato sul terminale;Eseguendo questo programma, il testo indicato verra’ semplicemente stampato sul terminale;

Page 49: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

49

Le regular expressions in PERLLe regular expressions in PERL

#!/usr/local/bin/perl while(<DATA>) {

}

#!/usr/local/bin/perl while(<DATA>) {

}

__END__

Questo testo contiene un certo certo numero di paroleduplicate. Scopo dello script di cui sopra e’ trovarlee indicare in quale paragrafo paragrafo esse si trovano

while ( m{

}xig )

{ print(“La parola $1 risulta duplicata nel paragrafo $.\n” ) ;}

\bPer ogni riga letta, itera sui seguenti elementi della riga:Per ogni riga letta, itera sui seguenti elementi della riga:

Considera tutti i word boundaries come punto di inizio dell’iterazione:Considera tutti i word boundaries come punto di inizio dell’iterazione:

\w\S+ Considera tutti caratteri che non siano SPACE come possibile parola...Considera tutti caratteri che non siano SPACE come possibile parola...

\s+\1

Il tutto finche’ compare uno spazio seguito dagli stessi caratteri appena trovati….Il tutto finche’ compare uno spazio seguito dagli stessi caratteri appena trovati….(

)Quando cio’ avviene, memorizza cio’ che sta fra le parentesi rosse in una variabile interna di PERL, $1, che conterra’ quindi cio’ che ha soddifatto il criterio di selezioneQuando cio’ avviene, memorizza cio’ che sta fra le parentesi rosse in una variabile interna di PERL, $1, che conterra’ quindi cio’ che ha soddifatto il criterio di selezione +

\bIl tutto ripetuto ad libitum fino al prossimo spazio biancoIl tutto ripetuto ad libitum fino al prossimo spazio bianco

x: usa il set completo di metacharacter. i: la ricerca deve essere case-insensitive.g: la ricerca non deve arrestarsi al primo pattern trovato per ogni parola analizzatax: usa il set completo di metacharacter. i: la ricerca deve essere case-insensitive.g: la ricerca non deve arrestarsi al primo pattern trovato per ogni parola analizzata

Page 50: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

50

Le regular expressions in PERLLe regular expressions in PERL

#!/usr/local/bin/perl while(<DATA>) {

}

#!/usr/local/bin/perl while(<DATA>) {

}

__END__

Questo testo contiene un certo certo numero di paroleduplicate. Scopo dello script di cui sopra e’ trovarlee indicare in quale paragrafo paragrafo esse si trovano

while ( m{

}xig )

{ print(“La parola $1 risulta duplicata nel paragrafo $.\n” ) ;}

\b

\w\S+

\s+\1

(

) +\b

La variabile $1 corrisponde a cio’ che e’ stato catturato dalle parentesi tondeossia ogni pattern che ripete se stesso dopo uno o piu’ spazi bianchiLa variabile $1 corrisponde a cio’ che e’ stato catturato dalle parentesi tondeossia ogni pattern che ripete se stesso dopo uno o piu’ spazi bianchi

Page 51: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

51

• Le regular expressions costituiscono uno dei punti di forza di PERL (pur essendo utilizzate in molti linguaggi, come awk, sed, egrep, la loro implementazione in PERL e’ la piu’ sofisticata).

• Le regular expressions costituiscono uno dei punti di forza di PERL (pur essendo utilizzate in molti linguaggi, come awk, sed, egrep, la loro implementazione in PERL e’ la piu’ sofisticata).

Questo corso ha uno scopo troppo limitato per poterdare una scorsa approfondita alle regular expressions.

Ci limiteremo quindi alle seguenti considerazioni:

Questo corso ha uno scopo troppo limitato per poterdare una scorsa approfondita alle regular expressions.

Ci limiteremo quindi alle seguenti considerazioni:

• L’apprendimento della sintassi delle regexp e’ piuttosto arduo. Cio’ nonostante, il loro uso permette la costruzione di programmi ed algoritmi estremamente efficienti e compatti: il beneficio che se ne trae vale sicuramente lo sforzo di imparare a conoscerle.

• L’apprendimento della sintassi delle regexp e’ piuttosto arduo. Cio’ nonostante, il loro uso permette la costruzione di programmi ed algoritmi estremamente efficienti e compatti: il beneficio che se ne trae vale sicuramente lo sforzo di imparare a conoscerle.

• Esiste un testo appositamente dedicato alle regexp, di cui daremo la citazione bibliografica al termine del corso• Esiste un testo appositamente dedicato alle regexp, di cui daremo la citazione bibliografica al termine del corso

Passiamo ora ad una serie di piccoli esempi pratici che mostrano comePERL possa essere utilizzato nell’attivita’ di un ricercatore impegnatoin un’attivita’ di analisi dei dati. Prima, pero’, un commento:

Passiamo ora ad una serie di piccoli esempi pratici che mostrano comePERL possa essere utilizzato nell’attivita’ di un ricercatore impegnatoin un’attivita’ di analisi dei dati. Prima, pero’, un commento:

Page 52: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

52

PERL, come gia’ detto, e’ perfettamente adatto anche per rappresentare e risolvereproblemi di matematica, anzi offre molte interessanti proprieta’: vediamo un esempio.

PERL, come gia’ detto, e’ perfettamente adatto anche per rappresentare e risolvereproblemi di matematica, anzi offre molte interessanti proprieta’: vediamo un esempio.

$x = [ [ 3, 2, 3 ], [ 5, 9, 8 ] ] ; $y = [ [ 4, 7 ], [ 2, 3 ], [ 6, 1 ] ] ; $z = mmult( $x, $y ) ; PrintMatrix( $z ) ;

[ 3, 2, 3 ],[ 5, 9, 8 ]

[ 3, 2, 3 ],[ 5, 9, 8 ]

[ 4, 7 ],[ 2, 3 ],[ 6, 1 ]

[ 4, 7 ],[ 2, 3 ],[ 6, 1 ]

Se eseguiamo questo programma otteniamo:Se eseguiamo questo programma otteniamo:

$x * $y = [ [ 34 30 ] [ 86 70 ] ]

$x * $y = [ [ 34 30 ] [ 86 70 ] ]

L’implementazione del prodotto e’ codificatain questa funzione: contrariamente al FORTRAN,essa e’ in grado di determinare da se’ il rangodelle matrici e dimensionare opportunamentela matrice risultato (in questo caso $z)

L’implementazione del prodotto e’ codificatain questa funzione: contrariamente al FORTRAN,essa e’ in grado di determinare da se’ il rangodelle matrici e dimensionare opportunamentela matrice risultato (in questo caso $z)

La funzione PrintMatrix non fa altro che stampare il risultato $z in un formato opprotuno, analogo a quello con cui sono definiti $x e $y

La funzione PrintMatrix non fa altro che stampare il risultato $z in un formato opprotuno, analogo a quello con cui sono definiti $x e $y

$x e $y sono in realta’ puntatori a delle strutture (che non sto a dettagliare) che contengono le matrici realizzate come vettori di vettori.

$x e $y sono in realta’ puntatori a delle strutture (che non sto a dettagliare) che contengono le matrici realizzate come vettori di vettori.

Un classico problema di moltiplicazione di matrici:Un classico problema di moltiplicazione di matrici:

Page 53: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

53

Un modo ancora piu’ elegante e sintetico per fare questo tipo di calcolo, e’ quello diusare un modulo matematico, detto PDL, disponibile su WEB, che realizza il prodottodi matrici tramite la funzionalita’ di function-overloading (analoga quella del C++).

Un modo ancora piu’ elegante e sintetico per fare questo tipo di calcolo, e’ quello diusare un modulo matematico, detto PDL, disponibile su WEB, che realizza il prodottodi matrici tramite la funzionalita’ di function-overloading (analoga quella del C++).

$x = [ [ 3, 2, 3 ], [ 5, 9, 8 ] ] ; $y = [ [ 4, 7 ], [ 2, 3 ], [ 6, 1 ] ] ; $z = $x * $y ; PrintMatrix( $z ) ;

[ 3, 2, 3 ],[ 5, 9, 8 ]

[ 3, 2, 3 ],[ 5, 9, 8 ]

[ 4, 7 ],[ 2, 3 ],[ 6, 1 ]

[ 4, 7 ],[ 2, 3 ],[ 6, 1 ]

use PDL ;

L’inclusione del mudulo PDF, fa si’ che l’operatore * venga ridefinito in modo da agire sulle matrici x ed y, realizzando il prodotto righe per colonne.

L’inclusione del mudulo PDF, fa si’ che l’operatore * venga ridefinito in modo da agire sulle matrici x ed y, realizzando il prodotto righe per colonne.

Page 54: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

54

Torniamo ora all’esempio citato all’inizio dello script di PAW che somma istogrammi provenienti da diversi files, e vediamo come sia possibile far scrivere questo scriptda una procedura PERL e quale vantaggio ne otteniamo

Torniamo ora all’esempio citato all’inizio dello script di PAW che somma istogrammi provenienti da diversi files, e vediamo come sia possibile far scrivere questo scriptda una procedura PERL e quale vantaggio ne otteniamo

Macro somma MaxHistos = 4 Do I = 1, [MaxHistos] Case [I] in (1) File = ‘pixelreadout.his’ (2) File = ‘pixelnocharge.his’ (3) File = ‘newpixeldata.his’ (4) File = ‘pixelredesign.his’ EndCase If ([I] .Eq. 1) then His/fil 1 [File] Else His/copy 15 100 Endif His/oper/add 15 100 100 His/plo 100EndDo

Vi rammento che il problema consiste nell’automatizzarela scrittura di questo pezzo del codice (in questo esempio)nel caso in cui la lista dei file con istogrammi da sommaresia ingente (dell’ordine di centinaia o migliaia di files).

Vi rammento che il problema consiste nell’automatizzarela scrittura di questo pezzo del codice (in questo esempio)nel caso in cui la lista dei file con istogrammi da sommaresia ingente (dell’ordine di centinaia o migliaia di files).

Page 55: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

55

#!/usr/local/bin/perl SetFilterRegexp() ;

sub SetFilterRegexp { $Filter = “pixel” ;}

sub SetFilterRegexp { $Filter = “pixel” ;}

Definisco una variabile che conterra’la regexp per selezionare i file voluti

Definisco una variabile che conterra’la regexp per selezionare i file voluti

sub GetFilesList { while( $File = <*.his> ) { if( $File =~ m/$Filter/i ) { push @FileList, $File ; }}

sub GetFilesList { while( $File = <*.his> ) { if( $File =~ m/$Filter/i ) { push @FileList, $File ; }}

Ciclo su tutti i file della directory correntee quelli che soddisfano il criterio di selezioneespresso dalla regexp $Filter vengono aggiuntial vettore @FileList

Ciclo su tutti i file della directory correntee quelli che soddisfano il criterio di selezioneespresso dalla regexp $Filter vengono aggiuntial vettore @FileList

GetFilesList() ;

$Script = “adder.kumac” ; open(OUT,”>$Script”) || die “Cannot open file $Script at $!” ;

Apro in scrittura il file che conterra’ lo scriptApro in scrittura il file che conterra’ lo script

PrintHeader() ;sub PrintHeader { print OUT <<EOBMacro adder Close 0 H/Del 0 EOB

sub PrintHeader { print OUT <<EOBMacro adder Close 0 H/Del 0 EOB

SpecifyFiles() ; sub SpecifyFiles { $i = 0; foreach $file (sort @FileList) { $i++ ; print OUT (“ H/Fil 1 $file\n” ) ; if( $i == 1 ) { print OUT (“ H/Copy 15 100\n” ) ; } else { print OUT (“ H/Oper/Add 15 100 100\n” ) ; } print OUT (“ Close 1\n\n” ) ; }}

sub SpecifyFiles { $i = 0; foreach $file (sort @FileList) { $i++ ; print OUT (“ H/Fil 1 $file\n” ) ; if( $i == 1 ) { print OUT (“ H/Copy 15 100\n” ) ; } else { print OUT (“ H/Oper/Add 15 100 100\n” ) ; } print OUT (“ Close 1\n\n” ) ; }}

Macro adder Close 0 H/Del 0

H/Fil 1 pixelreadout.his H/Copy 15 100 H/Oper/Add 15 100 100 Close 1

H/Fil 1 pixelnocharge.his H/Copy 15 100 H/Oper/Add 15 100 100 Close 1 ...

Macro adder Close 0 H/Del 0

H/Fil 1 pixelreadout.his H/Copy 15 100 H/Oper/Add 15 100 100 Close 1

H/Fil 1 pixelnocharge.his H/Copy 15 100 H/Oper/Add 15 100 100 Close 1 ...

Questo e’ il testo dello script sche abbiamo appena creatoQuesto e’ il testo dello script sche abbiamo appena creato

Page 56: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

56

Quali vantaggi abbiamo ottenuto nel far scrivere lo scriptkumac a PERL invece di crearlo noi a mano con l’editor?

Quali vantaggi abbiamo ottenuto nel far scrivere lo scriptkumac a PERL invece di crearlo noi a mano con l’editor?

• Lo script e’ del tutto generale: al cambiare dei files nella directory, lo script si autoconfigura opportunamente per tenere conto delle novita’ (file nuovi o file spariti) per selezionare files basati su un diverso aloritmo di selezione bastera’ cambiare il valore della variabile $Filter o implementare un algoritmo piu’ sofisticato per avere uno script sempre up-to-date

• Nel caso in cui i files siano diverse centinaia o migliaia risulta in pratica l’unico modo per creare lo script

• PERL e’ un linguaggio dotato di maggiore versatilita’ che non kumac, e cio’ e’ il motivo per cui risulta cosi’ efficace nell’agire come meta-linguaggio. Questa tecnica di generazione automatica di programmi in altri linguaggi e’ molto utile in numerosi altri casi (vedremo come cio’ e’ particolaremte vero nel caso di pagine HTML generate on demand in tempo reale.).

Page 57: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

57

Vediamo ora come si puo’ usare PERL per scrivere unprogramma che possa essere attivato da un bottonesituato in una pagina WEB.

Vediamo ora come si puo’ usare PERL per scrivere unprogramma che possa essere attivato da un bottonesituato in una pagina WEB.

Due parole su come funziona il protocollo WWWDue parole su come funziona il protocollo WWW

Page 58: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

58Questo e’ il vostro browserQuesto e’ il vostro browser

Questo e’ il server dove girera’ lo script in PERL che ci accingiamoa scrivere

Questo e’ il server dove girera’ lo script in PERL che ci accingiamoa scrivere

Comunicano tramite il protocollo TCP/IP (Internet)Comunicano tramite il protocollo TCP/IP (Internet)

Il server ha attivo un daemon che riceve richiestedal client (il browser) e risponde fornendo i documenti richiesti.

Il server ha attivo un daemon che riceve richiestedal client (il browser) e risponde fornendo i documenti richiesti.

httpd (server daemon)httpd (server daemon)

Le richieste possono essere di due tipi:• fornire un documento (testo,immagine,audio,video…)• eseguire un programma e spedire l’output di questo indietro al browser (tramite protocollo CGI)

Le richieste possono essere di due tipi:• fornire un documento (testo,immagine,audio,video…)• eseguire un programma e spedire l’output di questo indietro al browser (tramite protocollo CGI)

Il server agisce tramite una serie di filesdi configurazione che descrivono come deverispondere a richieste dal mondo esterno

Il server agisce tramite una serie di filesdi configurazione che descrivono come deverispondere a richieste dal mondo esterno

Page 59: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

59

Vediamo ora come realizzare un pagina WEB che contenga un bottone, premendo il quale ci venga restituita una lista di files di istogrammi(realizzati con HBOOK).I files saranno locati sulla macchina remota alla quale avremo sottomesso la richiesta.

Vediamo ora come realizzare un pagina WEB che contenga un bottone, premendo il quale ci venga restituita una lista di files di istogrammi(realizzati con HBOOK).I files saranno locati sulla macchina remota alla quale avremo sottomesso la richiesta.

Page 60: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

60

<HTML><TITLE> </TITLE>esempio_2_0.html<BODY BGCOLOR=“OldLace”>

<CENTER>

</CENTER>

<FORM ACTION= METHOD= >

</FORM>

“Get”

<INPUT

>

Type=“Submit”

Name=“SubmitButton”

Value=“Show list of available histograms”

Un tag HTML e’ una direttiva al browser per comunicargli come interpretare il testo racchiuso fra direttive. Convenzionalmenteindichero’ le direttive in color magenta

Un tag HTML e’ una direttiva al browser per comunicargli come interpretare il testo racchiuso fra direttive. Convenzionalmenteindichero’ le direttive in color magenta

esempio_2_0.html

INPUT specifica il tipo di strumento di controllo da associare al programmada eseguire. In questo caso ci sara’ un bottone di attivazione.

INPUT specifica il tipo di strumento di controllo da associare al programmada eseguire. In questo caso ci sara’ un bottone di attivazione.

“http://sgimida.mi.infn.it

Nome del nodo remotoNome del nodo remoto

/cgi-bin/scripts

Si tratta di un programma da eseguire, un CGI !Si tratta di un programma da eseguire, un CGI !

/histo_server.pl”

Nome del programmaNome del programma

Com’e’ fatta una pagina WEB?Molto schematicamente...

Com’e’ fatta una pagina WEB?Molto schematicamente...

FORM specifica l’indirizzo del programma da eseguire sulla macchina remota e la lista degli strumenti di controllo per fornirgli un input(bottoni, campi di input ecc…)

FORM specifica l’indirizzo del programma da eseguire sulla macchina remota e la lista degli strumenti di controllo per fornirgli un input(bottoni, campi di input ecc…)

Page 61: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

61

http://sgimida.mi.infn.it/~cntc/esempio_2_0.htmlhttp://sgimida.mi.infn.it/~cntc/esempio_2_0.html

Da un qualsiasi browser selezioniamo ora l’indirizzo del file HTML appena creato:Da un qualsiasi browser selezioniamo ora l’indirizzo del file HTML appena creato:

Page 62: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

62

Prima di procedere a premere questo tasto, diamo un’occhiata al codicePERL dello script associato a questo bottone dalla direttiva ACTION

Prima di procedere a premere questo tasto, diamo un’occhiata al codicePERL dello script associato a questo bottone dalla direttiva ACTION

Questo e’ il bottone associato all’attivazione del programmaQuesto e’ il bottone associato all’attivazione del programma

Page 63: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

63

#!/usr/local/bin/perl print(“Content type: text/html\n\n” ) ; $HisDir = “/vtx/boss/mcarlo/histos” ; print <<EOB ;

EOB

<HTML><TITLE> List of files in $HisDir </TITLE><Center>List of available histogram files on sgimida.mi.infn.it in $HisDir</Center><OL>

Inizio di una ORDERED LIST<OL> • Testo• . . . .

Inizio di una ORDERED LIST<OL> • Testo• . . . .

@ListOfFiles = <$HisDir/*.his> ;

Esempio di FILE GLOBBING: l’operatore < > restituisce la lista dei files con suffisso his nella directory $HisDir (agisce in un contesto vettoriale)

Esempio di FILE GLOBBING: l’operatore < > restituisce la lista dei files con suffisso his nella directory $HisDir (agisce in un contesto vettoriale)

foreach $File (@ListOfFiles) { print(“<LI> $File \n” ) ; } print(“</OL>\n” ) ;

histo_server.pl

Con un normale editor, creiamo il file histo_server.plCon un normale editor, creiamo il file histo_server.pl

Importante!!!!Lo STANDARD OUTPUT del corrente processo viene ritrasmesso al browser che ne ha richiesto l’esecuzione

Importante!!!!Lo STANDARD OUTPUT del corrente processo viene ritrasmesso al browser che ne ha richiesto l’esecuzione

Questa direttiva informa il browser che cio’ che gli verra’ trasmesso dal corrente processo sara’ da interpretare come un testo di tipo HTML

Questa direttiva informa il browser che cio’ che gli verra’ trasmesso dal corrente processo sara’ da interpretare come un testo di tipo HTML

Cio’ che viene posto tra i simboli EOB verra’ passato verbatim allo STANDARD OUTPUT

Cio’ che viene posto tra i simboli EOB verra’ passato verbatim allo STANDARD OUTPUT

Page 64: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

64

E’ giunto il momento di premere questo tasto:

Page 65: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

65

L’appetito vien mangiando: a questo punto vorremmo tanto che ogni elemento di questa lista fosse un link al contenuto del file, in modo che selezionando un file ci venisse mostrata la directory degli istogrammiivi contenuti….

L’appetito vien mangiando: a questo punto vorremmo tanto che ogni elemento di questa lista fosse un link al contenuto del file, in modo che selezionando un file ci venisse mostrata la directory degli istogrammiivi contenuti….

Difficile?Difficile?

Page 66: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

66

No, basta una piccola modifica allo script di prima, in aggiunta ad un nuovoscript che faccia girare PAW per fornirels lista richiesta. Vediamo come:

No, basta una piccola modifica allo script di prima, in aggiunta ad un nuovoscript che faccia girare PAW per fornirels lista richiesta. Vediamo come:

Page 67: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

67

#!/usr/local/bin/perl print(“Content type: text/html\n\n” ) ; $HisDir = “/vtx/boss/mcarlo/histos” ;

print <<EOB ;

EOB

<HTML><TITLE> List of files in $HisDir </TITLE><Center>List of available histogram files on sgimida.mi.infn.it in $HisDir</Center><OL>

@ListOfFiles = <$HisDir/*.his> ;

foreach $File (@ListOfFiles) {

print(“<LI> $ \n” ) ; } print(“</OL>\n” ) ;

$Server = “http://sgimida.mi.infn.it/cgi-bin/scripts” ;

$Ref = “<A HREF= > </A>” ;$Server/show_histos.pl?File=$File

Indirizzo dello script da eseguire

Indirizzo dello script da eseguire

Indirizzo del nodo su cui sta lo script da eseguireIndirizzo del nodo su cui sta lo script da eseguire

Marker di inizio dei parametri da passare allo script come inputMarker di inizio dei parametri da passare allo script come input

Coppia chiave/valore separati dal segno =Coppia chiave/valore separati dal segno =

$File

Stringa di caratteri che su browser apparira’ in blu e sottolineata a rappresentare il link richiesto (in questo caso l’esecuzione dello script)

Stringa di caratteri che su browser apparira’ in blu e sottolineata a rappresentare il link richiesto (in questo caso l’esecuzione dello script)

$RefInfine stampiamo il valore del link cosi’ formato sullo STANDARD OUTPUTdel processo corrente (che ovviamente corriponde alla pagina del browser)

Infine stampiamo il valore del link cosi’ formato sullo STANDARD OUTPUTdel processo corrente (che ovviamente corriponde alla pagina del browser)

Stesso script di prima...Stesso script di prima...

histo_server.pl

Definizione di hyperlinkDefinizione di hyperlink

Page 68: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

68

Voila’, ogni file e’ in realta’ un link ad uno script che, facendo girare PAW,produrra’ la lista degli istogrammicontenuti nel file medesimo!

Voila’, ogni file e’ in realta’ un link ad uno script che, facendo girare PAW,produrra’ la lista degli istogrammicontenuti nel file medesimo!

Prima pero’ vediamo come e’ fatta questa pagina HTML, output prodotto dallo script appena descritto...

Prima pero’ vediamo come e’ fatta questa pagina HTML, output prodotto dallo script appena descritto...

Page 69: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

69

Show

Increase font Ctrl+]Decrease font Ctrl+[

Reload Ctrl RShow ImagesRefreshStop page loading <ESC>Stop animations

Page source Ctrl UPage info Ctrl ICharacter set

ViewView

Page 70: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

70

<HTML>

<TITLE>List of available histogram files</TITLE><Body Bgcolor="OldLace"><Center>List of available histogram files on sgimida.mi.infn.it in /vtx/boss/mcarlo/histos</Center> <OL><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/carrara_3pi.his>/vtx/boss/mcarlo/histos/carrara_3pi.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/carrara_kkp.his>/vtx/boss/mcarlo/histos/carrara_kkp.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/carrara_kpp.his>/vtx/boss/mcarlo/histos/carrara_kpp.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/ccbar_3pi.his>/vtx/boss/mcarlo/histos/ccbar_3pi.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/clseccut_dt.his>/vtx/boss/mcarlo/histos/clseccut_dt.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/clseccut_mc.his>/vtx/boss/mcarlo/histos/clseccut_mc.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/data_3pi.his>/vtx/boss/mcarlo/histos/data_3pi.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/data_3pi_1.his>/vtx/boss/mcarlo/histos/data_3pi_1.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/data_kkp.his>/vtx/boss/mcarlo/histos/data_kkp.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/data_kpp.his>/vtx/boss/mcarlo/histos/data_kpp.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/dt_2k2pi.his>/vtx/boss/mcarlo/histos/dt_2k2pi.his</A><LI> <A HREF=..../show_histos.pl?File=/vtx/boss/mcarlo/histos/dt_2k2piws.his>/vtx/boss/mcarlo/histos/dt_2k2piws.his</A>....................................................

1. /vtx/boss/mcarlo/histos/carrara_3pi.his

Page 71: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

71

Ovviamente ora viene la parte un po’piu’ complessa: dobbiamo infatti scrivereil programma che fa partire PAW sulfile selezionato...

Ovviamente ora viene la parte un po’piu’ complessa: dobbiamo infatti scrivereil programma che fa partire PAW sulfile selezionato...

Page 72: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

72

Abbiamo visto che la definizione di un hyperlink e’ fatta nel modo seguente:Abbiamo visto che la definizione di un hyperlink e’ fatta nel modo seguente:

$Ref = “<A HREF= > </A>” ;$Server/show_histos.pl?File=$File $File

La coppia chiave/valore che segue il ? viene spedita al server, il quale la passaallo script show_histos.pl tramite una environmental variable, chiamataQUERY_STRING

La coppia chiave/valore che segue il ? viene spedita al server, il quale la passaallo script show_histos.pl tramite una environmental variable, chiamataQUERY_STRING

Si possono passare piu’ coppie, separandole con &Si possono passare piu’ coppie, separandole con &

File=$File & Parameter=$value& ...

Lo script non dovra’ far altro che leggere la QUERY_STRING (PERL offre delle funzioniadatte allo scopo) e separare le coppie chiave/valore. Chiave diverra’ il nome di una variabile il cui contenuto sara’ valore.

Lo script non dovra’ far altro che leggere la QUERY_STRING (PERL offre delle funzioniadatte allo scopo) e separare le coppie chiave/valore. Chiave diverra’ il nome di una variabile il cui contenuto sara’ valore.

Possiamo a questo punto scrive il programma che, facendo girare PAW sul fileselezionato con un click sullo hyperlink, ci fornisca l’elenco degli istogrammi.Possiamo a questo punto scrive il programma che, facendo girare PAW sul fileselezionato con un click sullo hyperlink, ci fornisca l’elenco degli istogrammi.

QUERY_STRINGQUERY_STRING

Page 73: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

73

#!/usr/local/bin/perl

PrintHeader() ;

DecodeQueryString() ;

open (OUT, “>lista2.kumac”) || die “Cannot open kumac file” ;

print OUT<<EOB ;

EOB

Macro lista H/Del 0 Message Working on file $File H/Fil 1 $File H/Lis Close 1

close(OUT) ;

La KUMAC e’ pronta: ora bisogna creare uno shell script che faccia partire PAW dandogli in pasto la KUMAC da eseguire.

La KUMAC e’ pronta: ora bisogna creare uno shell script che faccia partire PAW dandogli in pasto la KUMAC da eseguire.

open (OUT, “>paw2.sh”); print OUT<<EOB ;

EOB

#!/usr/bin/sh /disk3/products/pawx11 <<+++0

exec lista2.kumac+++

A questo punto non resta che far eseguire questo script per avviare PAW.

A questo punto non resta che far eseguire questo script per avviare PAW.

system(“chmod +x paw2.sh” ) ;

Ovviamente vanno prima sistemate le protezioniper poterlo far eseguire dal WEB server!!!!…

Ovviamente vanno prima sistemate le protezioniper poterlo far eseguire dal WEB server!!!!…

Lo script show_histos.pl e’ pronto peressere eseguito dal WEB server in seguito alla richiesta di un utente dal browser!!!

Lo script show_histos.pl e’ pronto peressere eseguito dal WEB server in seguito alla richiesta di un utente dal browser!!!

Ecco lo script KUMAC che verra’ eseguito da PAW!!

Sub PrintHeader { print <<EOB;Content-type: text/html<HTML><TITLE> Output di PAW </TITLE><PRE>EOB}

Sub PrintHeader { print <<EOB;Content-type: text/html<HTML><TITLE> Output di PAW </TITLE><PRE>EOB}

Sub DecodeQueryString { $qs = $ENV{‘QUERY_STRING’} ; @pairs = split( /&/, $qs ) ; foreach $key_val (@pairs) { ($key, $value) = split(/=/, $key_val); . . . . $$key = $value ;

}

Sub DecodeQueryString { $qs = $ENV{‘QUERY_STRING’} ; @pairs = split( /&/, $qs ) ; foreach $key_val (@pairs) { ($key, $value) = split(/=/, $key_val); . . . . $$key = $value ;

}

Fornisce la variabile $File con il nome selezionato dall’utente con lo hyperlink

Fornisce la variabile $File con il nome selezionato dall’utente con lo hyperlink

Page 74: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

74

open( PAW, “./paw2.sh |”) ;

Apriamo una PIPE per eseguire lo script che fa girare PAW

Apriamo una PIPE per eseguire lo script che fa girare PAW

while( <PAW> ) {

}

Mentre lo script paw2.sh viene eseguito, tutto cio’ che esso produce sul suo STDOUT viene catturato nella variabile $_ e stampato sullo STDOUT del corrente processo (il nostro browser). Ricordo che l’output di paw2.sh e’ cio’ che stampa la kumac che produce la lista degli istogrammi.

Mentre lo script paw2.sh viene eseguito, tutto cio’ che esso produce sul suo STDOUT viene catturato nella variabile $_ e stampato sullo STDOUT del corrente processo (il nostro browser). Ricordo che l’output di paw2.sh e’ cio’ che stampa la kumac che produce la lista degli istogrammi.

print ;

Stampiamo questo output sullo STDOUT, che, ricordo, e’ la pagina del browser...

Stampiamo questo output sullo STDOUT, che, ricordo, e’ la pagina del browser...

close (PAW) ;

Chiudiamo la PIPE, e voila’, lo script e’ pronto a ricevere comandi dal browser e a fornire liste di istogrammi

Chiudiamo la PIPE, e voila’, lo script e’ pronto a ricevere comandi dal browser e a fornire liste di istogrammi

show_histos.pl

… continuazione

Page 75: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

75

Clicchiamo ora su uno dei files...Clicchiamo ora su uno dei files...

Page 76: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

76

Page 77: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

77

Sarebbe a questo punto certamentepossibile rendere cliccabile ognisingolo istogramma di questa lista,in modo che venga eseguito un scriptche ci restituisca l’istogramma inquestione in formato grafico (GIF)direttamente sul browser (e magariprovvedesse un link aggiuntivo perla versione POSTSCRIPT ad altarisoluzione….

Sarebbe a questo punto certamentepossibile rendere cliccabile ognisingolo istogramma di questa lista,in modo che venga eseguito un scriptche ci restituisca l’istogramma inquestione in formato grafico (GIF)direttamente sul browser (e magariprovvedesse un link aggiuntivo perla versione POSTSCRIPT ad altarisoluzione….

Page 78: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

78

Lo script che possa fare cio’ none’ molto piu’ complicato di quantoabbiamo visto finora, ma esula dalloscopo di questo corso. Cio’ che e’ importante e’ cogliere il fatto chee’ relativamente semplice creare unainterfaccia WEB a normali programmidi analisi dati, col beneficio che tuttii membri di unavasta collaborazioneinternazionale hanno rapido accesso ai dati ed anche ai programmi tramiteun’interfaccia standard quale un browser

Lo script che possa fare cio’ none’ molto piu’ complicato di quantoabbiamo visto finora, ma esula dalloscopo di questo corso. Cio’ che e’ importante e’ cogliere il fatto chee’ relativamente semplice creare unainterfaccia WEB a normali programmidi analisi dati, col beneficio che tuttii membri di unavasta collaborazioneinternazionale hanno rapido accesso ai dati ed anche ai programmi tramiteun’interfaccia standard quale un browser

Page 79: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

79

L’estrema parsimonia sintattica di PERL puo’ essere utilizzata congrande vantaggio, purche’ cio’ sia fatto cum grano salis, in quantoil risultato puo’ essere qualcosa di estremamente incomprensibile equindi di difficile manutenzione.Un paio di esempi tratti dallo Annual Obfuscated PERL Contest :

L’estrema parsimonia sintattica di PERL puo’ essere utilizzata congrande vantaggio, purche’ cio’ sia fatto cum grano salis, in quantoil risultato puo’ essere qualcosa di estremamente incomprensibile equindi di difficile manutenzione.Un paio di esempi tratti dallo Annual Obfuscated PERL Contest :

Calcola e stampa i numeri primi… (sic)Calcola e stampa i numeri primi… (sic)Molto bello esteticamente, ma francamente

non sono riuscito a capire cosa fa...

Molto bello esteticamente, ma francamente

non sono riuscito a capire cosa fa...

Page 80: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

80

Page 81: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

81

Operatori di file-test

-r File is readable by effective uid.

-w File is writable by effective uid.

-x File is executable by effective uid.-o File is owned by effective uid.-R File is readable by real uid.-W File is writable by real uid.-X File is executable by real uid.-O File is owned by real uid.-e File exists-z File has zero size (it’s empty)-f File is a plain-file-d File is a directory-l File is a symbolic link-p File is a nmed pipe-s File is socket-b File is a block special file-c File is a character special file-t Filehandle is opened to a tty-T File is a text file-B File is a binary file-M Age of file (at startup) in days since modification-A Age of file (at startup) in days since last access-C Age of file (at startup) in days since inode change

Back...Back...

Page 82: 1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce.

82

#!/usr/local/bin/perl system(“ls -la *.txt“) ;

#!/usr/local/bin/perl system(“ls -la *.txt“) ;

> chmod +x test.pl> chmod +x test.pl

test.pltest.pl

-rw------- 1 menasce e831 112 Sep 10 14:39 CP_violation.txt-rwx------ 1 menasce e831 1499 Nov 13 1996 banner.txt-rw------- 1 menasce e831 80 Sep 10 21:42 example.txt-rwx------ 1 menasce e831 1639 Nov 13 1996 plots.txt-rw------- 1 menasce e831 8927 Sep 11 13:41 plots_beauty.txt-rw------- 1 menasce e831 8685 Sep 10 20:27 plots_charm.txt-rw-r----- 1 menasce e831 11623 Sep 10 20:27 psi_cross_section.txt-rwx------ 1 menasce e831 1580 Nov 13 1996 ratio.txtdrwxr-x--- 2 menasce e831 8192 Sep 10 18:44 rose_scheme.txt-rwx------ 1 menasce e831 1552 Nov 13 1996 transparencies_bristol.txtdrwx------ 4 menasce e831 8192 Sep 11 13:41 usage.txt-rw-r----- 1 menasce e831 27248640 Sep 10 20:22 zero_level.txt

> ./test.pl> ./test.pl

Back...Back...