La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "1 Introduzione agli scripting languages ed ai WEB tools Dario Menasce."— Transcript della presentazione:

1

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

3 2 Introduzione 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

4 3 Scripting language ---> collante tra le funzionalita di un sistema operativo o, piu in generale, tra le funzioni primitive di un ambiente applicativo. Scripting language ---> collante tra le funzionalita di un sistema operativo o, piu in generale, tra le funzioni primitive di un ambiente applicativo. Cose uno scripting language?

5 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) Daltra 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 di funzionare in modo minimale e sicuramente dotata almeno di una shell (generalmente la shell sh), per cui gli script di quella shell potranno, in linea di principio, funzionare anche 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 usare PERL (con grande vantaggio e soddisfazione) per fargli generare degli script kumac (un modo di usare PERL come meta-linguaggio)

6 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 di linguaggi: e possibile con esso scrivere sofisticate interfacce utente, come ad esempio un completo browser o uninterfaccia ad un DAQ. JavaScript e uno scripting language che opera ESCLUSIVAMENTE allinterno di un WEB browser (tipicamente Netscape o InternetExplorer). E utilizzato per aggiungere funzionalita dinamiche alle pagine WEB, come ad esempio verificare la validita 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 centinaia di clients, demandando ad essi tutta la computazionalita necessaria.

7 6 Es: shell script kumac Tcl/Tk JavaScript Es: shell script kumac Tcl/Tk JavaScript Tutti gli esempi indicati sono legati allambiente particolare per i quali erano stati progettati: Tutti gli esempi indicati sono legati allambiente particolare per i quali erano stati progettati: PERL, al contrario, e quasi totalmente portabile e general-purpose. gratuito. E universalmente disponibile in rete ed e 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. gratuito. E universalmente disponibile in rete ed e 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

8 7 Kumac: scripting language di PAW (Physics Analysis Workstation) PAW> fun1 1 sin(x)/x unix> paw Identifier (Id) Numero di punti (bins) Limiti

9 8 Kumac: scripting language di PAW (Physics Analysis Workstation) PAW> fun1 1 sin(x)/x unix> paw PAW> fun2 2 sin(x)/x*sin(y)/y

10 9 PAW> fun1 1 sin(x)/x 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 Unita di I/O Nome file Record size Flag: New file Salva tutti (0) gli istogrammi definiti Dopo aver definito gli istogrammi salviamoli su disco in un file:

11 10 PAW> fun1 1 sin(x)/x 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 rw-r--r-- 1 menasce e Sep 8 19:43 histograms_file.his Vogliamo ora riaprire questo file e stampare gli istogrammi in formato grafico

12 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 istogrammi leggendoli dal file precedentemente salvato Ripristina in memoria i dati degli istogrammi leggendoli dal file precedentemente salvato

13 12 Supponiamo ora di avere a disposizione 4 files di istogrammi e di voler sommare gli istogrammi con Id=15 fra loro, mettendo il risultato nellistogramma con Id=100. Sara utile allo scopo preparare uno script (somma.kumac) e farlo eseguire in PAW. Supponiamo ora di avere a disposizione 4 files di istogrammi e di voler sommare gli istogrammi con Id=15 fra loro, mettendo il risultato nellistogramma con Id=100. Sara utile allo scopo preparare 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 his/oper/add Predispone i cicli per ogni file Definisce il numero di files da considerare A seconda del ciclo corrente, definisce un diverso nome di file a aprire in lettura A seconda del ciclo corrente, definisce un 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 file hanno nomi non componibili con un algoritmo automatico e sono in numero molto elevato. Sistema poco pratico, soprattutto se i file hanno nomi non componibili con un algoritmo automatico e sono in numero molto elevato. Vedremo come luso di PERL ci faciliti nel compito di automatizzare la scrittura degli scripts (useremo PERL come meta-linguaggio) Vedremo come luso di PERL ci faciliti nel compito di automatizzare la scrittura degli scripts (useremo PERL come meta-linguaggio) his/plo 100 Il primo istogramma viene copiato pari pari in un nuovo istogramma con Id=100 Il primo istogramma viene copiato pari pari in un nuovo istogramma con Id=100 somma.kumac Ogni nuovo istogramma viene sommato a quello con Id=100 Ogni nuovo istogramma viene sommato a quello con Id=100

14 13 Domanda: io che sono un fisico e non uno studioso di informatica, quali vantaggi posso trarre dalluso di PERL nella mia attivita quotidiana? Domanda: io che sono un fisico e non uno studioso di informatica, quali vantaggi posso trarre dalluso 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 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 flessibile Pur 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 Portabile 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 processi 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. 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 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

15 14 E interpretato Pur essendo interpretato e piuttosto veloce in esecuzione. Inoltre ha la caratteristica di avere accesso a run-time al proprio compilatore Pur essendo interpretato e piuttosto veloce in esecuzione. Inoltre ha la caratteristica di avere accesso a run-time al proprio compilatore La sua velocita non e pero comparabile a quella di un programma compilato (inadatto ad applicazioni che siano critiche nei tempi di esecuzione, tipo DAQ o real-time) La sua velocita non e pero comparabile a quella di un programma compilato (inadatto ad applicazioni che siano critiche 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 dellinterpreter. Prima di passare ad una descrizione del linguaggio PERL, vediamo se il nostro computer ha una versione installata e recente dellinterpreter.

16 15 > which perl Fornisce il full path-name delleseguibile purche sia in uno di quelli specificati nella variabile PATH Fornisce il full path-name delleseguibile purche sia in uno di quelli specificati nella variabile PATH > whereis perl Cerca leseguibile, e le eventuali man-pages associate in tutto il tree / (root directory tree) Cerca leseguibile, e le eventuali man-pages associate in tutto il tree / (root directory tree) > locate perl Cerca in un apposito database del sistema (solo su LINUX) tutte le istanze di files contenenti la stringa perl interpretata come regular-expression Cerca in un apposito database del sistema (solo su LINUX) tutte le istanze di files contenenti la stringa perl interpretata come regular-expression > perl -v This is perl, version 5.004_01 Copyright , Larry Wall Perl may be copied only under the terms of either the Artistic Licence or the GNU General Public Licence, which may be found in the PERL 5.0 source kit. > perl -w source.pl Interpreta il file source.pl, stampa eventuali warnings di compilazione, e lo esegue Interpreta il file source.pl, stampa eventuali warnings di compilazione, e lo esegue > perl -c source.pl Interpreta il file source.pl, stampa eventuali warnings di compilazione, ma NON lo esegue Interpreta il file source.pl, stampa eventuali warnings di compilazione, ma NON lo esegue Versione 5.004_01

17 16 test.pl La sintassi di PERL I tipi di variabili Gli scalari $Number = 16; Come in C, anche in PERL unistruzione e terminata dal ; $mass = ; $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 $Address $Number

18 17 La sintassi di PERL I tipi di variabili I = (1,2,3,4,5,6) ; Il nome collettivo di un vettore e identificato = ( ) = ( ) Nome collettivo Un singolo elemento di un vettore e uno scalare! Un singolo elemento di un vettore e 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 !!!

19 18 La sintassi di PERL = (1, ab, $var) ; Inizializziamo un vettore con tre ; Ne facciamo una copia $length ; Calcoliamo il numero di elementi del vettore $length varra 3 ($one) ; 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) ; 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 $b $fred[1] = alpha ; $new = $fred[0]++; $new = $fred[1]++ Riassegna un valore al secondo elemento del vettore Incrementa il primo elemento del vettore (diventa 2) Incrementa il secondo elemento del vettore: poiche e una stringa, incrementa il valore ASCII dellultimo carattere della stringa (diventa ac ) Incrementa il secondo elemento del vettore: poiche e una stringa, incrementa il valore ASCII dellultimo carattere 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 lindice dell ultimo elemento del vettore (in questo caso 2 ) Restituisce lindice dell ultimo elemento del vettore (in questo caso 2 )

20 19 La sintassi di PERL = (1, ab, $var) ; Inizializziamo un vettore con tre elementi: $last = $fred[-1] ; Restituisce lultimo elemento del vettore ( $var ) $lastind ; Restituisce lindice dell ultimo elemento del vettore (in questo caso 2 ) Restituisce lindice dell ultimo elemento del vettore (in questo caso 2 ) $fred[8] = $pippo ; Aumenta la dimensione del vettore a 9 elementi definendo lultimo: gli elementi [4],[5],[6],[7] avranno valore undef Aumenta la dimensione del vettore a 9 elementi definendo lultimo: 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 )

21 20 La sintassi di PERL Sono possibili manipolazioni arbitrariamente complesse sugli elementi di un vettore (il confronto con il FORTRAN diverra evidente) Sono possibili manipolazioni arbitrariamente complesse sugli elementi di un vettore (il confronto con il FORTRAN diverra = (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 = (2, 1, 0 ) ; Inizializzo un secondo vettore a tre elementi contenente tre numeri che rappresentano lordine con cui voglio riassemblare il primo vettore Inizializzo un secondo vettore a tre elementi contenente tre numeri che rappresentano lordine con cui voglio riassemblare il primo ) Cio e equivalente 1, 0) = ($fred[2], $fred[1], $fred[0]) ; Che e a sua volta equivalente = (nove, otto, sette) ; Vediamo come fare per invertire lordine degli elementi di questo vettore:

22 21 La 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: push, pop, shift and = (1, two, three) ; $newvalue = 4 ; $newvalue ; print( mylist ) ; mylist = 1 two three 4 print( mylist ) ; mylist = 1 two three 4 Stack 1 1 $mylist[0] two $mylist[1] three $mylist[2] 4 4 $mylist[3] push estende la dimensione del vettore e aggiunge lultimo elemento in coda push estende la dimensione del vettore e aggiunge lultimo elemento in coda

23 22 La sintassi di PERL Gli operatori di stacking: push, pop, shift and unshift $lastadded = ) ; print( Last added = $lastadded\n ) ; Last added = 4 print( Last added = $lastadded\n ) ; Last added = $mylist[0] two $mylist[1] three $mylist[2] 4 4 $mylist[3] pop rimuove lultimo elemento dello stack (la gestione degli indici e a carico di pop) pop rimuove lultimo elemento dello stack (la gestione degli indici e a carico di pop)

24 23 La sintassi di PERL Gli operatori di stacking: push, pop, shift and unshift $mylist = (1,two,three) ; zero ) ; print( mylist ) ; mylist = zero 1 two three print( mylist ) ; mylist = zero 1 two three 1 1 $mylist[0] two $mylist[1] three $mylist[2] unshift agginunge un elemento al primo posto nel vettore: poiche rinumera gli elementi, puo essere inefficiente per vettori molto grandi. unshift agginunge un elemento al primo posto nel vettore: poiche rinumera gli elementi, puo essere inefficiente per vettori molto grandi. zero $mylist[0] 1 1 $mylist[1] two $mylist[2] three $mylist[3]

25 24 La sintassi di PERL Gli operatori di stacking: push, pop, shift and unshift $out = ; print( Taken out = $out\n ) ; Taken out = zero print( Taken out = $out\n ) ; Taken out = zero 1 1 $mylist[0] two $mylist[1] three $mylist[2] shift rimuove il primo elemento dello stack: di nuovo, viene rinumerato tutto il vettore. shift rimuove il primo elemento dello stack: di nuovo, viene rinumerato tutto il vettore. zero $mylist[0] 1 1 $mylist[1] two $mylist[2] three $mylist[3]

26 25 La sintassi di PERL Gli operatori di ordinamento e = (1, 2, 3, 4) = ) ; ; ; = (gamma, beta, alfa ) = sort ; ; alfa beta gamma ; alfa beta = ; 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)

27 26 La sintassi di PERL I tipi di variabili Le hash tables 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. 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: %sede{ Dario Menasce => Milano, $utente => Torino } ; Ed e anche equivalente a: %sede = (Dario Menasce, Milano, $utente, Torino } ; Chiave = %sede ; Una hash puo essere trasformata in una lista... %nuovasede ; … e viceversa Chiave Valore Chiave Valore Chiave Valore

28 27 La sintassi di PERL I tipi di variabili Le 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 ;

29 28 La sintassi di PERL I tipi di variabili Gli operatori sulle hash tables Loperatore 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 p La lettera greca rho corrisponde alla latina r La lettera greca beta corrisponde alla latina b La lettera greca alpha corrisponde alla latina a La lettera greca pi corrisponde alla latina p La lettera greca rho corrisponde alla latina r La lettera greca beta corrisponde alla latina b La lettera greca alpha corrisponde alla latina a Loperatore each restituisce, in un contesto vettoriale, tutte le coppie chiave/valore definite per la hash in questione Loperatore each restituisce, in un contesto vettoriale, tutte le coppie chiave/valore definite per la hash in questione

30 29 La sintassi di PERL I tipi di variabili Gli operatori sulle hash tables Loperatore keys $Hash{alpha} = a ; $Hash{beta} = b ; $Hash{rho} = r ; $Hash{pi} = p = keys ( %Hash ) ; print ; pi rho beta alpha Lordine non e quello di inserimento, bensi quello determinato dallalgoritmo di hashing. Se vogliamo una lista ordinata alfabeticamente useremo loperatore sort Lordine non e quello di inserimento, bensi quello determinato dallalgoritmo di hashing. Se vogliamo una lista ordinata alfabeticamente useremo loperatore = sort keys ( %Hash ) ; print ; alpha beta pi rho Loperatore values agisce sui valori della hash in modo analogo: Loperatore values agisce sui valori della hash in modo = sort values ( %Hash ) ; print ; a b p r

31 30 La sintassi di PERL I tipi di variabili Gli operatori sulle hash tables Esistono innumerevoli modi per assegnare elementi ad una hash Esistono innumerevoli modi per assegnare elementi ad una hash $record{Fred} = 205 ; $record{Barney} = 195 ; $record{Wilma} = 30 Barney, Wilma} = (205, 195, 30) ; Ad ogni personaggio associamo il suo record personale a bowling... Ad ogni personaggio associamo il suo record personale a = {Fred, Barney, Dino} = (205, 195, 30) ) = ; Queste due forme di assegnazione sono completamente equivalenti Queste due forme di assegnazione sono completamente equivalenti Un altro modo ancora... Indipendentemente da viene assegnato... Indipendentemente da viene assegnato... while (($persona, $valore) = each %record) { print(Il record di $persona e $valore\n ) ; } Il record di Barney e 195 Il record di Fred e 205 Il record di Wilma e 30 Il record di Barney e 195 Il record di Fred e 205 Il record di Wilma e 30

32 31 La sintassi di PERL Le strutture di controllo 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 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 { block ; } foreach $i { block ; }

33 32 open (IN, myfile.dat) ; while ( ) { print ; } close(IN) ; open (IN, myfile.dat) ; while ( ) { print ; } close(IN) ; La sintassi di PERL Operazioni 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 sistema operativo, 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 sistema operativo, analogo alla UNIT del FORTRAN $_= ($_\n) Il 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 modo identico al comando UNIX cat myfile.dat Questo script si comporta in modo identico al comando UNIX cat myfile.dat

34 33 La sintassi di PERL Operazioni di I/O 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:

35 34 La sintassi di PERL Operazioni di I/O Il concetto di file-globbing Come faccio a mettere in un vettore la lista dei files di una directory che iniziano con la stringa host seguito da qualsiasi carattere? Come faccio a mettere in un vettore la lista dei files di una directory che iniziano con la stringa host seguito da qualsiasi = ;/etc/host* Con una sola istruzione otteniamo i seguenti risultati: con gli operatori abbiamo aperto un canale di I/O con la wild-card * specifichiamo un intero range di nomi loutput delloperatore 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 abbiamo aperto un canale di I/O con la wild-card * specifichiamo un intero range di nomi loutput delloperatore 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 { print ($file) ; } In modo ancora piu conciso: foreach ( ) { print ; }

36 35 La sintassi di PERL Operatori di interazione col filesystem locale Un altro punto di forza di PERL e la sua portabilita : questa e realizzata creando unabstraction layer tra la funzionalita e l implementazione di un comando diretto al sistema operativo. Vediamo alcuni esempi utili: Un altro punto di forza di PERL e la sua portabilita : questa e realizzata creando unabstraction layer tra la funzionalita e l implementazione di un comando 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... Equivale a...

37 36 Controllo di processi E frequente la necessita di interagire con il sistema operativo dallinterno 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 dallinterno 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 unoperazione per la quale esiste un opportuno comando di sistema che non si vuole reinventare, come ad esempio il comando di stampa di un file, lpr, o il comando di cancellazione file Quando occorre eseguire unoperazione per la quale esiste un opportuno comando di sistema che non si vuole reinventare, come ad esempio il comando di stampa di un file, lpr, o il comando di cancellazione file

38 37 Controllo di processi Il metodo piu semplice e luso della funzione system: system( ) ; comando comando al sistema operativo ls -la *.txt Leventuale 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) Leventuale 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 processo padre. Luso e problematico nel caso il figlio generi delloutput, poiche questo verra mescolato in 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 processo padre. Luso e problematico nel caso il figlio generi delloutput, poiche questo verra mescolato in 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 loutput generato dal comando eseguito dal sistema operativo, una volta mandato allo STDOUT, e perso, non possiamo usarlo allinterno dello script PERL che lo ha lanciato!!!. System e utile, ma loutput generato dal comando eseguito dal sistema operativo, una volta mandato allo STDOUT, e perso, non possiamo usarlo allinterno 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), nellambito 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), nellambito del quale viene eseguito il comando specificato (il comando viene passato alla shell sh). Queste istruzioni sono assolutamente equivalenti al comando printenv Queste istruzioni sono assolutamente equivalenti al comando printenv

39 38 Controllo di processi Loperatore backticks ( ` ): un primo modo per catturare loutput di un processo di sistema $now = Current date is ;.` 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 vengono valutati 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 vengono valutati in un contesto scalare ed il risultato posto in una variabile = `who` ; Il comando who genera un output con diverse linee, una per ogni utente: loutput viene quindi valutato in un contesto vettoriale, ed ogni linea verra memorizzata in un elemento del Il comando who genera un output con diverse linee, una per ogni utente: loutput viene quindi valutato in un contesto vettoriale, ed ogni linea verra memorizzata in un elemento del

40 39 Controllo di processi Un modo ancora piu flessibile e dato dalloperatore open associato ad una pipe open(, who ) ;CHI Il nome di un file-handle: esso conterra il canale di I/O associato alloutput prodotto dal comando who. Occorre specificare che who deve ridirigere loutput ad una pipe, ossia allo script corrente, ossia... Il nome di un file-handle: esso conterra il canale di I/O associato alloutput prodotto dal comando who. Occorre specificare che who deve ridirigere loutput 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 ( ) { print ; } close(CHI) ; Qui ce un semplice print: in realta possiamo manipolare ogni riga di output di who agendo sulla variabile $_. Qui ce un semplice print: in realta possiamo manipolare ogni riga di output di who agendo sulla variabile $_. E se volessimo mandare loutput, eventualmente modificato, direttamente ad una stampante laser? Facile... E se volessimo mandare loutput, eventualmente modificato, direttamente ad una stampante laser? 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 far precedere il comando per il sistema operativo dal simbolo di pipe!!! Per mandare degli argomenti ad una pipe, occorre far precedere il comando per il sistema operativo dal simbolo di pipe!!!

41 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 popolare 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 popolare Una caratteristica interessante di PERL, e la capacita di eseguire una stringa di caratteri, interpretandola come un blocco di istruzioni. La stringa puo essere composta leggendo dati dallesterno del programma: diviene allora possibile scrivere oggetti di estrema generalita come pocket-calculators e simili. Cio e possibile grazie al fatto che il linguaggio PERL ha accesso al proprio interpreter, al quale puo fornire ulteriori parti di programma composte a 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 stringa puo essere composta leggendo dati dallesterno del programma: diviene allora possibile scrivere oggetti di estrema generalita come pocket-calculators e simili. Cio e possibile grazie al fatto che il linguaggio PERL ha accesso al proprio interpreter, al quale puo fornire ulteriori parti di programma composte a 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 unarbitraria serie di istruzioni e le esegua. Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input unarbitraria serie di istruzioni e le esegua.

42 41 Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input unarbitraria serie di istruzioni e le esegua. Consideriamo il seguente esempio: vogliamo scrivere un programma che accetti in input unarbitraria serie di istruzioni e le esegua. while(1) { print(> ) ; $result = eval ; print($result\n) ; } while(1) { print(> ) ; $result = eval ; print($result\n) ; } Stampa 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); RETURN > 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 grado di 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 grado di 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

43 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 = ; $r = eval { } ; Blocco di istruzioni potenzialmente capaci di generare un errore Blocco di istruzioni potenzialmente capaci di generare un errore $c = $a / $b 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 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

44 43 Le regular expressions in PERL Una regular expression non e altro che un modo sintetico per descrivere un particolare pattern di caratteri, spesso mediante luso 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 luso 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 luso 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 luso delle regular expression, strumento disponibile in diverse famiglie di linguaggi Lesempio piu semplice di regular expression e la wild-card (il simbolo *), spesso usato in congiunzione al comando ls di UNIX: essa rappresenta in modo astratto il concetto qualunque insieme di caratteri Lesempio piu semplice di regular expression e la wild-card (il simbolo *), spesso usato in congiunzione al comando ls di UNIX: essa rappresenta in modo astratto il concetto qualunque insieme di caratteri Vediamo un esmpio articolato, per risolvere il quale luso di una regular expression si dimostri particolarmente efficace

45 44 -rw-r--r-- 1 menasce e Nov drve831_threepi.runsts -rwxr-xr-x 1 menasce e Nov mcfocus_threepi.csh -rw-r menasce e Nov mcfocus_threepi.log -rw-r--r-- 1 menasce e Nov mcfocus_threepi.make -rw-r--r-- 1 menasce e Nov mcfocus_threepi.mcf -rw-r--r-- 1 menasce e Nov mcfocus_threepi.nam -rw-r menasce e Nov mcfocus_threepi.out_dat -rw-r--r-- 1 menasce e Nov mcfocus_threepi.paw -rwxr-x--x 1 menasce e Sep mcfocus_threepi.run -rw-r--r-- 1 menasce e Apr mcfocus_threepi.sf -rw-r--r-- 1 menasce e Nov new_threepi_mc.txt -rw-r--r-- 1 menasce e Nov new_threepi_PAW_mc.txt -rw-r--r-- 1 menasce e Jul threepi.kumac -rw-r--r-- 1 menasce e Jul threepi_match.kumac -rw-r--r-- 1 menasce e Jul threepi_res.ftn -rw-r--r-- 1 menasce e Jul threepi_res.kumac -rw-r--r-- 1 menasce e Nov ugly_threepi.sf -rw-r--r-- 1 menasce e Jul under_threepi.sf -rw-r--r-- 1 menasce e Nov usrinit_threepi.sf -rw-r--r-- 1 menasce e Jul usrmisc_threepi.sf -rw-r--r-- 1 menasce e Jul usrpack_threepi.sf -rw-r--r-- 1 menasce e Nov usrstop_threepi.sf -rw-r--r-- 1 menasce e Jul usrunpk_threepi.sf > ls -la *three* > ls -la *three* | grep -v mc -rw-r--r-- 1 menasce e Nov drve831_threepi.runsts -rwxr-xr-x 1 menasce e Nov mcfocus_threepi.csh -rw-r menasce e Nov mcfocus_threepi.log -rw-r--r-- 1 menasce e Nov mcfocus_threepi.make -rw-r--r-- 1 menasce e Nov mcfocus_threepi.mcf -rw-r--r-- 1 menasce e Nov mcfocus_threepi.nam -rw-r menasce e Nov mcfocus_threepi.out_dat -rw-r--r-- 1 menasce e Nov mcfocus_threepi.paw -rwxr-x--x 1 menasce e Sep mcfocus_threepi.run -rw-r--r-- 1 menasce e Apr mcfocus_threepi.sf -rw-r--r-- 1 menasce e Nov new_threepi_mc.txt -rw-r--r-- 1 menasce e Nov new_threepi_PAW_mc.txt -rw-r--r-- 1 menasce e Jul threepi.kumac -rw-r--r-- 1 menasce e Jul threepi_match.kumac -rw-r--r-- 1 menasce e Jul threepi_res.ftn -rw-r--r-- 1 menasce e Jul threepi_res.kumac -rw-r--r-- 1 menasce e Nov ugly_threepi.sf -rw-r--r-- 1 menasce e Jul under_threepi.sf -rw-r--r-- 1 menasce e Nov usrinit_threepi.sf -rw-r--r-- 1 menasce e Jul usrmisc_threepi.sf -rw-r--r-- 1 menasce e Jul usrpack_threepi.sf -rw-r--r-- 1 menasce e Nov usrstop_threepi.sf -rw-r--r-- 1 menasce e Jul usrunpk_threepi.sf -rw-r--r-- 1 menasce e Nov drve831_threepi.runsts -rw-r--r-- 1 menasce e Jul threepi.kumac -rw-r--r-- 1 menasce e Jul threepi_match.kumac -rw-r--r-- 1 menasce e Jul threepi_res.ftn -rw-r--r-- 1 menasce e Jul threepi_res.kumac -rw-r--r-- 1 menasce e Nov ugly_threepi.sf -rw-r--r-- 1 menasce e Jul under_threepi.sf -rw-r--r-- 1 menasce e Nov usrinit_threepi.sf -rw-r--r-- 1 menasce e Jul usrmisc_threepi.sf -rw-r--r-- 1 menasce e Jul usrpack_threepi.sf -rw-r--r-- 1 menasce e Nov usrstop_threepi.sf -rw-r--r-- 1 menasce e Jul 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... Iniziamo con leliminare 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 alcuni di questi file, usando un criterio di selezione basato sulla presenza nel nome di un certo pattern di caratteri: Troppi: vogliamo selezionare solo alcuni di questi file, usando un criterio di selezione basato sulla presenza nel nome di un certo pattern di caratteri: -rw-r--r-- 1 menasce e Nov drve831_threepi.runsts -rwxr-xr-x 1 menasce e Nov mcfocus_threepi.csh -rw-r menasce e Nov mcfocus_threepi.log -rw-r--r-- 1 menasce e Nov mcfocus_threepi.make -rw-r--r-- 1 menasce e Nov mcfocus_threepi.mcf -rw-r--r-- 1 menasce e Nov mcfocus_threepi.nam -rw-r menasce e Nov mcfocus_threepi.out_dat -rw-r--r-- 1 menasce e Nov mcfocus_threepi.paw -rwxr-x--x 1 menasce e Sep mcfocus_threepi.run -rw-r--r-- 1 menasce e Apr mcfocus_threepi.sf -rw-r--r-- 1 menasce e Nov new_threepi_mc.txt -rw-r--r-- 1 menasce e Nov new_threepi_PAW_mc.txt -rw-r--r-- 1 menasce e Jul threepi.kumac -rw-r--r-- 1 menasce e Jul threepi_match.kumac -rw-r--r-- 1 menasce e Jul threepi_res.ftn -rw-r--r-- 1 menasce e Jul threepi_res.kumac -rw-r--r-- 1 menasce e Nov ugly_threepi.sf -rw-r--r-- 1 menasce e Jul under_threepi.sf -rw-r--r-- 1 menasce e Nov usrinit_threepi.sf -rw-r--r-- 1 menasce e Jul usrmisc_threepi.sf -rw-r--r-- 1 menasce e Jul usrpack_threepi.sf -rw-r--r-- 1 menasce e Nov usrstop_threepi.sf -rw-r--r-- 1 menasce e Jul usrunpk_threepi.sf Risultato raggiunto, ma in un modo poco flessibile: vediamo come si puo ottenere lo stesso risultato utilizzando le regular expressions in uno script PERL Risultato raggiunto, ma in un modo poco flessibile: vediamo come si puo ottenere lo stesso risultato utilizzando le regular expressions in uno script PERL

46 45 Le regular expressions in PERL Vediamo 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 ;

47 46 Le regular expressions in PERL Vediamo 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 match sf 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

48 47 Le regular expressions in PERL Vediamo 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 che iniziano con mc modifichiamo ulteriormente la regexp: if (m/sf$/ && !m/^mc/) {print} ; Se poi non desideriamo nella lista i file che iniziano con mc modifichiamo ulteriormente la regexp: if (m/sf$/ && !m/^mc/) {print} ; Simbolo di NOT 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 criptico da interpretare, ma si tratta di uno strumento veramente molto potente. Una regular expression: puo essere qualcosa di estremamente complesso e criptico da interpretare, ma si tratta di uno strumento veramente molto potente. Supponiamo di voler cercare le parole duplicate in un testo:

49 48 Le regular expressions in PERL #!/usr/local/bin/perl while( ) { } #!/usr/local/bin/perl while( ) { } __END__ Questo testo contiene un certo certo numero di parole duplicate. Scopo dello script di cui sopra e trovarle e indicare in quale paragrafo paragrafo esse si trovano { print ; } Eseguendo questo programma, il testo indicato verra semplicemente stampato sul terminale;

50 49 Le regular expressions in PERL #!/usr/local/bin/perl while( ) { } #!/usr/local/bin/perl while( ) { } __END__ Questo testo contiene un certo certo numero di parole duplicate. Scopo dello script di cui sopra e trovarle e indicare in quale paragrafo paragrafo esse si trovano while ( m{ }xig ) { print(La parola $1 risulta duplicata nel paragrafo $.\n ) ; } \b Per ogni riga letta, itera sui seguenti elementi della riga: Considera tutti i word boundaries come punto di inizio delliterazione: \w\S+ Considera tutti caratteri che non siano SPACE come possibile parola... \s+ \1 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 selezione 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 selezione + \b Il 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 analizzata 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 analizzata

51 50 Le regular expressions in PERL #!/usr/local/bin/perl while( ) { } #!/usr/local/bin/perl while( ) { } __END__ Questo testo contiene un certo certo numero di parole duplicate. Scopo dello script di cui sopra e trovarle e 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 tonde ossia ogni pattern che ripete se stesso dopo uno o piu spazi bianchi La variabile $1 corrisponde a cio che e stato catturato dalle parentesi tonde ossia ogni pattern che ripete se stesso dopo uno o piu spazi bianchi

52 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 poter dare una scorsa approfondita alle regular expressions. Ci limiteremo quindi alle seguenti considerazioni: Questo corso ha uno scopo troppo limitato per poter dare una scorsa approfondita alle regular expressions. Ci limiteremo quindi alle seguenti considerazioni: Lapprendimento 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. Lapprendimento 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 come PERL possa essere utilizzato nellattivita di un ricercatore impegnato in unattivita di analisi dei dati. Prima, pero, un commento: Passiamo ora ad una serie di piccoli esempi pratici che mostrano come PERL possa essere utilizzato nellattivita di un ricercatore impegnato in unattivita di analisi dei dati. Prima, pero, un commento:

53 52 PERL, come gia detto, e perfettamente adatto anche per rappresentare e risolvere problemi di matematica, anzi offre molte interessanti proprieta: vediamo un esempio. PERL, come gia detto, e perfettamente adatto anche per rappresentare e risolvere problemi 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: $x * $y = [ [ ] [ ] ] $x * $y = [ [ ] [ ] ] Limplementazione del prodotto e codificata in questa funzione: contrariamente al FORTRAN, essa e in grado di determinare da se il rango delle matrici e dimensionare opportunamente la matrice risultato (in questo caso $z ) Limplementazione del prodotto e codificata in questa funzione: contrariamente al FORTRAN, essa e in grado di determinare da se il rango delle matrici e dimensionare opportunamente la 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:

54 53 Un modo ancora piu elegante e sintetico per fare questo tipo di calcolo, e quello di usare un modulo matematico, detto PDL, disponibile su WEB, che realizza il prodotto di 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 di usare un modulo matematico, detto PDL, disponibile su WEB, che realizza il prodotto di 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 ; Linclusione del mudulo PDF, fa si che loperatore * venga ridefinito in modo da agire sulle matrici x ed y, realizzando il prodotto righe per colonne. Linclusione del mudulo PDF, fa si che loperatore * venga ridefinito in modo da agire sulle matrici x ed y, realizzando il prodotto righe per colonne.

55 54 Torniamo ora allesempio citato allinizio dello script di PAW che somma istogrammi provenienti da diversi files, e vediamo come sia possibile far scrivere questo script da una procedura PERL e quale vantaggio ne otteniamo Torniamo ora allesempio citato allinizio dello script di PAW che somma istogrammi provenienti da diversi files, e vediamo come sia possibile far scrivere questo script da 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 Endif His/oper/add His/plo 100 EndDo Vi rammento che il problema consiste nellautomatizzare la scrittura di questo pezzo del codice (in questo esempio) nel caso in cui la lista dei file con istogrammi da sommare sia ingente (dellordine di centinaia o migliaia di files). Vi rammento che il problema consiste nellautomatizzare la scrittura di questo pezzo del codice (in questo esempio) nel caso in cui la lista dei file con istogrammi da sommare sia ingente (dellordine di centinaia o migliaia di files).

56 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 = ) { if( $File =~ m/$Filter/i ) { $File ; } sub GetFilesList { while( $File = ) { if( $File =~ m/$Filter/i ) { $File ; } Ciclo su tutti i file della directory corrente e quelli che soddisfano il criterio di selezione espresso dalla regexp $Filter vengono aggiunti al Ciclo su tutti i file della directory corrente e quelli che soddisfano il criterio di selezione espresso dalla regexp $Filter vengono aggiunti al GetFilesList() ; $Script = adder.kumac ; open(OUT,>$Script) || die Cannot open file $Script at $! ; Apro in scrittura il file che conterra lo script PrintHeader() ; sub PrintHeader { print OUT <

57 56 Quali vantaggi abbiamo ottenuto nel far scrivere lo script kumac a PERL invece di crearlo noi a mano con leditor? Quali vantaggi abbiamo ottenuto nel far scrivere lo script kumac a PERL invece di crearlo noi a mano con leditor? Lo script e del tutto generale: 1 al cambiare dei files nella directory, lo script si autoconfigura opportunamente per tenere conto delle novita (file nuovi o file spariti) 1 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 lunico 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 nellagire 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.).

58 57 Vediamo ora come si puo usare PERL per scrivere un programma che possa essere attivato da un bottone situato in una pagina WEB. Vediamo ora come si puo usare PERL per scrivere un programma che possa essere attivato da un bottone situato in una pagina WEB. Due parole su come funziona il protocollo WWW

59 58 Questo e il vostro browser Questo e il server dove girera lo script in PERL che ci accingiamo a scrivere Questo e il server dove girera lo script in PERL che ci accingiamo a scrivere Comunicano tramite il protocollo TCP/IP (Internet ) Il server ha attivo un daemon che riceve richieste dal client (il browser) e risponde fornendo i documenti richiesti. Il server ha attivo un daemon che riceve richieste dal client (il browser) e risponde fornendo i documenti richiesti. httpd (server daemon) Le richieste possono essere di due tipi: fornire un documento (testo,immagine,audio,video…) eseguire un programma e spedire loutput 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 loutput di questo indietro al browser (tramite protocollo CGI) Il server agisce tramite una serie di files di configurazione che descrivono come deve rispondere a richieste dal mondo esterno Il server agisce tramite una serie di files di configurazione che descrivono come deve rispondere a richieste dal mondo esterno

60 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.

61 60 esempio_2_0.html

Get 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. Convenzionalmente indichero le direttive in color magenta Un tag HTML e una direttiva al browser per comunicargli come interpretare il testo racchiuso fra direttive. Convenzionalmente indichero le direttive in color magenta esempio_2_0.html INPUT specifica il tipo di strumento di controllo da associare al programma da eseguire. In questo caso ci sara un bottone di attivazione. INPUT specifica il tipo di strumento di controllo da associare al programma da eseguire. In questo caso ci sara un bottone di attivazione. Nome 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 programma Come fatta una pagina WEB? Molto schematicamente... Come fatta una pagina WEB? Molto schematicamente... FORM specifica lindirizzo 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 lindirizzo del programma da eseguire sulla macchina remota e la lista degli strumenti di controllo per fornirgli un input (bottoni, campi di input ecc…)

62 61 Da un qualsiasi browser selezioniamo ora lindirizzo del file HTML appena creato:

63 62 Prima di procedere a premere questo tasto, diamo unocchiata al codice PERL dello script associato a questo bottone dalla direttiva ACTION Prima di procedere a premere questo tasto, diamo unocchiata al codice PERL dello script associato a questo bottone dalla direttiva ACTION Questo e il bottone associato allattivazione del programma

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

65 64 E giunto il momento di premere questo tasto:

66 65 Lappetito 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 istogrammi ivi contenuti…. Lappetito 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 istogrammi ivi contenuti…. Difficile?

67 66 No, basta una piccola modifica allo script di prima, in aggiunta ad un nuovo script che faccia girare PAW per fornire ls lista richiesta. Vediamo come: No, basta una piccola modifica allo script di prima, in aggiunta ad un nuovo script che faccia girare PAW per fornire ls lista richiesta. Vediamo come:

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

69 68 Voila, ogni file e in realta un link ad uno script che, facendo girare PAW, produrra la lista degli istogrammi contenuti nel file medesimo! Voila, ogni file e in realta un link ad uno script che, facendo girare PAW, produrra la lista degli istogrammi contenuti 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...

70 69 Show Increase font Ctrl+] Decrease font Ctrl+[ Reload Ctrl R Show Images Refresh Stop page loading Stop animations Page source Ctrl U Page info Ctrl I Character set View

71 70 List of available histogram files List of available histogram files on sgimida.mi.infn.it in /vtx/boss/mcarlo/histos /vtx/boss/mcarlo/histos/carrara_3pi.his /vtx/boss/mcarlo/histos/carrara_kkp.his /vtx/boss/mcarlo/histos/carrara_kpp.his /vtx/boss/mcarlo/histos/ccbar_3pi.his /vtx/boss/mcarlo/histos/clseccut_dt.his /vtx/boss/mcarlo/histos/clseccut_mc.his /vtx/boss/mcarlo/histos/data_3pi.his /vtx/boss/mcarlo/histos/data_3pi_1.his /vtx/boss/mcarlo/histos/data_kkp.his /vtx/boss/mcarlo/histos/data_kpp.his /vtx/boss/mcarlo/histos/dt_2k2pi.his /vtx/boss/mcarlo/histos/dt_2k2piws.his /vtx/boss/mcarlo/histos/carrara_3pi.his

72 71 Ovviamente ora viene la parte un po piu complessa: dobbiamo infatti scrivere il programma che fa partire PAW sul file selezionato... Ovviamente ora viene la parte un po piu complessa: dobbiamo infatti scrivere il programma che fa partire PAW sul file selezionato...

73 72 Abbiamo visto che la definizione di un hyperlink e fatta nel modo seguente: $Ref = ;$Server/show_histos.pl?File=$File$File La coppia chiave/valore che segue il ? viene spedita al server, il quale la passa allo script show_histos.pl tramite una environmental variable, chiamata QUERY_STRING La coppia chiave/valore che segue il ? viene spedita al server, il quale la passa allo script show_histos.pl tramite una environmental variable, chiamata QUERY_STRING 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 funzioni adatte 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 funzioni adatte 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 file selezionato con un click sullo hyperlink, ci fornisca lelenco degli istogrammi. Possiamo a questo punto scrive il programma che, facendo girare PAW sul file selezionato con un click sullo hyperlink, ci fornisca lelenco degli istogrammi. QUERY_STRING

74 73 #!/usr/local/bin/perl PrintHeader() ; DecodeQueryString() ; open (OUT, >lista2.kumac) || die Cannot open kumac file ; print OUT<paw2.sh); print OUT<

75 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( ) { } 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 loutput 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 loutput 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

76 75 Clicchiamo ora su uno dei files...

77 76

78 77 Sarebbe a questo punto certamente possibile rendere cliccabile ogni singolo istogramma di questa lista, in modo che venga eseguito un script che ci restituisca listogramma in questione in formato grafico (GIF) direttamente sul browser (e magari provvedesse un link aggiuntivo per la versione POSTSCRIPT ad alta risoluzione…. Sarebbe a questo punto certamente possibile rendere cliccabile ogni singolo istogramma di questa lista, in modo che venga eseguito un script che ci restituisca listogramma in questione in formato grafico (GIF) direttamente sul browser (e magari provvedesse un link aggiuntivo per la versione POSTSCRIPT ad alta risoluzione….

79 78 Lo script che possa fare cio non e molto piu complicato di quanto abbiamo visto finora, ma esula dallo scopo di questo corso. Cio che e importante e cogliere il fatto che e relativamente semplice creare una interfaccia WEB a normali programmi di analisi dati, col beneficio che tutti i membri di unavasta collaborazione internazionale hanno rapido accesso ai dati ed anche ai programmi tramite uninterfaccia standard quale un browser Lo script che possa fare cio non e molto piu complicato di quanto abbiamo visto finora, ma esula dallo scopo di questo corso. Cio che e importante e cogliere il fatto che e relativamente semplice creare una interfaccia WEB a normali programmi di analisi dati, col beneficio che tutti i membri di unavasta collaborazione internazionale hanno rapido accesso ai dati ed anche ai programmi tramite uninterfaccia standard quale un browser

80 79 Lestrema parsimonia sintattica di PERL puo essere utilizzata con grande vantaggio, purche cio sia fatto cum grano salis, in quanto il risultato puo essere qualcosa di estremamente incomprensibile e quindi di difficile manutenzione. Un paio di esempi tratti dallo Annual Obfuscated PERL Contest : Lestrema parsimonia sintattica di PERL puo essere utilizzata con grande vantaggio, purche cio sia fatto cum grano salis, in quanto il risultato puo essere qualcosa di estremamente incomprensibile e quindi di difficile manutenzione. Un paio di esempi tratti dallo Annual Obfuscated PERL Contest : 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...

81 80

82 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 (its 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...

83 82 #!/usr/local/bin/perl system(ls -la *.txt) ; #!/usr/local/bin/perl system(ls -la *.txt) ; > chmod +x test.pl test.pl -rw menasce e Sep 10 14:39 CP_violation.txt -rwx menasce e Nov banner.txt -rw menasce e Sep 10 21:42 example.txt -rwx menasce e Nov plots.txt -rw menasce e Sep 11 13:41 plots_beauty.txt -rw menasce e Sep 10 20:27 plots_charm.txt -rw-r menasce e Sep 10 20:27 psi_cross_section.txt -rwx menasce e Nov ratio.txt drwxr-x--- 2 menasce e Sep 10 18:44 rose_scheme.txt -rwx menasce e Nov transparencies_bristol.txt drwx menasce e Sep 11 13:41 usage.txt -rw-r menasce e Sep 10 20:22 zero_level.txt >./test.pl Back...


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

Presentazioni simili


Annunci Google