La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Bioinformatica Linguaggio Perl (1) Dr. Giuseppe Pigola – Dr. Alessandro Laganà –

Presentazioni simili


Presentazione sul tema: "Bioinformatica Linguaggio Perl (1) Dr. Giuseppe Pigola – Dr. Alessandro Laganà –"— Transcript della presentazione:

1 Bioinformatica Linguaggio Perl (1) Dr. Giuseppe Pigola – Dr. Alessandro Laganà –

2 Cosè PERL? PERL ( Practical Extraction and Report Language ) è un linguaggio di programmazione interpretato General Purpose. Viene usato in ogni settore come linguaggio colla, cioè adatto ad unire vari elementi. Scrivere un Database, un foglio elettronico, un Sistema Operativo o un server Web completo in PERL sarebbe possibile ma praticamente inutile. La funzione principale di PERL è invece unire i vari elementi. 2Bioinformatica

3 PERL linguaggio colla PERL può prendere un database, convertirlo in un file adatto per un foglio elettronico e, durante lelaborazione, correggere i dati. PERL è anche in grado di prendere i documenti di un elaboratore di testi e convertirli nel formato HTML per la visualizzazione sul Web. Essendo un linguaggio mirato ad unire gli elementi, PERL si adatta facilmente alle varie situazioni. Ha uno stile di programmazione molto flessibile e quindi è possibile eseguire la stessa operazione in più modi. 3Bioinformatica

4 Link e Risorse Sito ufficiale: Sito Italiano: Active Perl: 4Bioinformatica

5 Il primo programma PERL Una volta digitato il programma nelleditor di testo, lo salviamo come hello. Non è necessario aggiungere lestensione del file, anche se PERL consente di farlo. Le estensioni più comuni sono.pl o.plx. Per eseguire il programma è necessario aprire la finestra Prompt dei comandi, possibilmente nella directory in cui è stato salvato hello.pl. #!/usr/bin/perl print Hello, World!\n; 5Bioinformatica

6 PERL passo per passo Per PERL tutto ciò che appare dopo il simbolo # è un commento. Il simbolo #! sulla prima riga di un programma è diversa in alcuni casi: il nome di percorso che segue fa riferimento al percorso dellinterprete PERL: #!/usr/bin/perl Se un file UNIX inizia con il simbolo #! seguito dal percorso di un interprete, UNIX sa che si tratta di un programma e sa anche come interpretarlo. Lo stesso vale per alcuni server Web, tra cui APACHE; 6Bioinformatica #!/usr/bin/perl use strict; # Forza la dichiarazione di variabili use warning; # Forza linizializzazione di variabili, controlla deprecated;

7 PERL, linguaggio a forma libera PERL è noto come linguaggio di programmazione a forma libera; ciò significa che le istruzioni di PERL non sono esigenti sul modo in cui sono scritte. In unistruzione PERL è possibile inserire spazi, tabulazioni, ritorni a capo, senza problemi (a meno che non vengano spezzate delle parole chiave): #!/usr/bin/perl print Hello, World!\n ; 7Bioinformatica

8 Unità di base di PERL: numeri e stringhe In PERL, i numeri e le stringhe sono le unità di base e prendono il nome di scalari. Così come in altri linguaggi di programmazione, in PERL esistono scalari costanti (o letterali) e scalari variabili. 8Bioinformatica

9 I letterali numerici PERL offre due tipi diversi di costanti scalari di nome letterali: i letterali numerici e i letterali stringa. I letterali numerici sono numeri e PERL consente di scrivere i numeri in diversi modi: NumeroTipo di letterale 6Un intero 12.5Un numero in virgola mobile 15.Un altro numero in virgola mobile Un altro numero in virgola mobile 1e10Notazione scientifica 6.67E-33Notazione scientifica 4_294_296Un numero grande con caratteri di sottolineatura come separatore di migliaia 9Bioinformatica

10 I letterali stringa In PERL i letterali stringa sono sequenze di caratteri, come Hello, World. E necessario racchiudere le stringhe letterali in apici, singoli o doppi : Gli apici allinterno delle stringhe devono essere preceduti dal simbolo di backslash \. foo! Fourscore and seven years ago Then I said to him, \Go ahead!\ The doctor\s stethoscope was cold. 10Bioinformatica

11 I letterali stringa (2) La differenza principale tra le stringhe con doppi apici e quelle con apici singoli è che queste ultime sono letterali. Ogni carattere in una stringa con apici singoli significa esattamente tale carattere. Daltra parte, in una stringa con doppi apici, PERL controlla se sono presenti nomi di variabili o sequenze di escape e li traduce se li trova. Le sequenze di escape sono stringhe speciali che consentono di incorporare caratteri nelle stringhe quando la digitazione degli stessi causerebbero problemi. 11Bioinformatica

12 Alcune sequenze di escape SequenzaRappresenta \nNuova riga \rRitorno a capo \tTabulazione \bBackspace \uVisualizza il carattere seguente in maiuscolo \lVisualizza il carattere seguente in minuscolo \\Un carattere backslash letterale \Un letterale allinterno di una stringa racchiusa tra apici singoli \Un letterale allinterno di una stringa racchiusa tra apici doppi 12Bioinformatica

13 Operatori q e qq (Delimitatori) Oltre agli apici PERL offre gli operatori qq e q. Per usare qq si può racchiudere il letterale stringa in qq( ) al posto degli apici: E possibile usare loperatore q al posto degli apici singoli per racchiudere il testo: qq(I said, Go then, and he said Im gone) q(Toms kite wedged in Sues tree) 13Bioinformatica

14 Operatori q e qq (2) Al posto delle parentesi si può usare qualsiasi altro carattere non alfabetico e non numerico per delimitare una stringa: Il carattere da usare come delimitatore deve comparire subito dopo loperatore q o qq. Se si usa una coppia di caratteri ( ), <>,{ } o [ ] come delimitatori, dovranno essere nidificati appropriatamente: Tuttavia questo metodo non rende i programmi molto leggibili, per cui conviene scegliere delimitatori che non appaiono nella stringa: q/Toms kite wedged in Sues tree/ q,Toms kite wedged in Sues tree, q(Joe (Toms dad) fell out of a (rather large) tree.); Q[Joe (Toms dad) fell out of a (rather large) tree.]; 14Bioinformatica

15 Variabili scalari Per memorizzare dati scalari in PERL è necessario usare una variabile scalare. In PERL le variabili scalari sono indicate con il simbolo del dollaro ($ - Identificatore del tipo) seguito dal nome della variabile: $a $total $Date $serial_number $cat450 15Bioinformatica

16 Variabili scalari (2) Gli altri tipi di variabili (hash e array) usano un identificatore diverso o addirittura nessun identificatore (filehandle). I nomi delle variabili in PERL, siano esse hash, array, filehandle o scalari, devono essere conformi alle regole seguenti: Possono contenere caratteri alfabetici (a-z, A-Z), numeri o caratteri di sottolineatura (_) dopo lidentificatore del tipo. Tuttavia il primo carattere del nome non può essere un numero. I nomi delle variabili sono sensibili alle maiuscole/minuscole 16Bioinformatica

17 Variabili scalari (3) PERL riserva per sé stesso nomi di variabili di un solo carattere che non iniziano con un carattere alfabetico o di sottolineatura. Le variabili come $_, $, $/, $2 e $$ sono variabili speciali la cui funzione sarà spiegata in seguito. Le variabili scalari in PERL non devono essere dichiarate o inizializzate prima di poterle usare. Per creare una variabile scalare è sufficiente usarla. PERL usa un valore predefinito quando una variabile non è inizializzata. Se è usata come numero PERL userà il valore 0, se è usata come stringa PERL userà la stringa vuota. 17Bioinformatica

18 La variabile speciale $_ PERL dispone di una variabile speciale $_ il cui valore è usato come predefinito da molti operatori e funzioni. Per esempio se si digita print senza specificare una variabile scalare o un letterale stringa da stampare, PERL stamperà il valore corrente di $_: $_=Dark Side of the Moon print;# Stampa il valore di $_ 18Bioinformatica

19 Espressioni Un semplice programma PERL: Unespressione (in rosso) in PERL è semplicemente qualcosa con un valore. Per esempio 2 è unespressione valida. I valori delle espressioni sono calcolati allesecuzione del programma. #!/usr/bin/perl –w $radius=50; $area= *($radius ** 2); print $area 19Bioinformatica

20 Operatori: Assegnazione Loperatore di assegnazione = prende il valore a destra e lo inserisce nella variabile a sinistra: Loperando di sinistra deve essere qualcosa a cui può essere assegnato un valore. Loperando a destra può essere qualsiasi tipo di espressione. Lintera assegnazione è unespressione: $title=Gone with the wind; $pi= ; $a=$b=$c=97; $count=$count+1; 20Bioinformatica

21 Operatori numerici EsempioNome operatore 5 + $tAddizione $t - $sSottrazione $e * $piMoltiplicazione $f / 6Divisione 24 % 5Modulo 4 ** 2Potenza 21Bioinformatica

22 Operatori stringa Concatenazione: Interpolazione di variabili: $a=Hello, World!; $b=Nice to meet you; $c=$a. $b; $name=John; print I went to the store with $name.; 22Bioinformatica

23 Operatori stringa (2) Linterpolazione si può impedire usando gli apici singoli o facendo precedere lidentificatore della variabile da un backslash: La concatenazione si può eseguire così: $name=Ringo; print I used the variable $name print I used the variable \$name $fruit1=apples; $fruit2=and oranges; $bowl=$fruit1 $fruit2; 23Bioinformatica

24 Operatori stringa (3) Se il nome di una variabile è seguito immediatamente da lettere, numeri o apici, PERL non sarà in grado di distinguere chiaramente dove finisce il nome della variabile e inizia il resto della stringa. In questo caso si possono usare parentesi graffe { } attorno al nome della variabile: $date=Thurs; Print I went to the fair on ${date}day; $name=Bob; Print This is ${name}s house; 24Bioinformatica

25 Operatori stringa (4) x è loperatore di ripetizione; prende due valori, una stringa da ripetere e il numero di volte da ripeterla: $line=- x 70; # Stampa 70 volte – e memorizza il risultato in $line 25Bioinformatica

26 Operatori unari Operatori unari con simbolo: Operatori unari con nome: -6;# 6 negativo -(-5);# 5 positivo OperatoreEsempioRisultato intint(5.6234)5 lengthlength(nose)4 lclc(ME TOO)me too ucuc(hal 9000)HAL 9000 coscos(50)Coseno di 50 in radianti randrand(5)Numero casuale compreso tra 0 e 5 (tra 0 e 1 se largomento è omesso) 26Bioinformatica

27 Incremento e decremento $counter++;# incrementa la variabile counter $counter--;# decrementa la variabile counter $a=c9; $a++; print $a;# stampa d0 $a=zzz; $a++; print $a;# stampa aaaa 27Bioinformatica

28 Operatore angolare Questo operatore è usato per leggere e scrivere file. La sua forma più semplice indica a PERL che una riga di input dovrebbe essere letta dal dispositivo di input (tastiera): La riga di testo letta da include anche il carattere di nuova riga digitato premendo invio. E possibile rimuoverlo utilizzando la funzione chomp: print What size is your shoe?; $size= ; print Your shoe size is $size. Thank you!\n; print What size is your shoe?; $size= ; Chomp $size; print Your shoe size is $size. Thank you!\n; 28Bioinformatica

29 Altri operatori di assegnazione La regola generale per creare unassegnazione con un operatore è la seguente: variabile operatore=espressione Questa forma di assegnazione equivale a: variabile=variabile operatore espressione Ad esempio: $a=$a+3; $a+=3;# uguale alla riga precedente $line.=, at the end# accoda la stringa, at… a $line $t%=67;# divide $t per 67 e inserisce il resto in $t 29Bioinformatica

30 Considerazioni su stringhe e numeri PERL consente spesso di usare numeri e stringhe in modo intercambiabile. Se un elemento ha laspetto di un numero PERL può usarlo come tale se ne ha bisogno: $a=42;# un numero print $a+18;# stampa 60 $b=50;# una stringa print $b-10;# stampa 40 30Bioinformatica

31 Considerazioni su stringhe e numeri (2) Allo stesso modo se un elemento ha laspetto di un numero, quando PERL necessita di una stringa può rappresentarlo come tale: Se un elemento non ha laspetto di un numero ma viene usato dove era previsto luso di un numero PERL usa al suo posto il valore 0: $a=42/3;# un numero $a=$a. Hello; # usa un numero come stringa print $a;# stampa 14Hello $a=Hello, World!; print $a+6;# visualizza il numero 6, la stringa vale 0 # PERL ci avvisa della circostanza se attiviamo –w sulla riga #! 31Bioinformatica

32 Controllare il flusso del programma Blocchi di istruzioni; Operatori; Cicli; Etichette; Come uscire da PERL dopo lesecuzione di un programma; 32Bioinformatica

33 Blocchi Il metodo principale per raggruppare le istruzioni in PERL è rappresentato dai blocchi: { istruzione_a; istruzione_b; istruzione_c; } { istruzione_a; { istruzione_x; istruzione_y; } 33Bioinformatica

34 Listruzione if if (espressione) blocco if (espressione) blocco1 else blocco2 $r= ; chomp $r; If ($r == 10) { print $r is 10; } else { print $r is something other than 10…; $r=10; print $r has been set to 10; } 34Bioinformatica

35 Elsif if (espressione1) blocco1 elsif (espressione2) blocco2 else blocco3 $r= ; if ($r == 10) { print $r is 10!; } elsif ($r == 20) { print $r is 20!; } else { print $r is neither 10 nor 20; } 35Bioinformatica

36 Altri operatori relazionali OperatoreEsempioDescrizione ==$s == $tVero se $s è uguale a $t >$s > $tVero se $s è maggiore di $t <$s < $tVero se $s è minore di $t >=$s >= $tVero se $s è maggiore o uguale a $t <=$s <= $tVero se $s è minore o uguale a $t !=$s != $tVero se $s non è uguale a $t 36Bioinformatica

37 Uso improprio degli operatori relazionali Consideriamo il seguente esempio: Dato che PERL si aspetta valori numerici, le stringhe vengono valutate 0, per cui lespressione precedente è simile a $first=Simon; $last=Simple; if ($first == $last) { print The words are the same!\n; } if (0 == 0) 37Bioinformatica

38 Operatori relazionali per valori non numerici OperatoreEsempioDescrizione eq$s eq $tVero se $s è uguale a $t gt$s gt $tVero se $s è maggiore di $t lt$s lt $tVero se $s è minore di $t ge$s ge $tVero se $s è maggiore o uguale a $t le$s le $tVero se $s è minore o uguale a $t ne$s ne $tVero se $s non è uguale a $t 38Bioinformatica

39 Significato di vero per PERL Il numero 0 è falso; La stringa vuota e la stringa 0 sono false; Il valore non definito undef è falso; Tutto il resto è vero. Quando si verifica unespressione per vedere se è vera o falsa questa viene semplificata, quindi viene convertita in un valore scalare per poter determinare se è vera o falsa. 39Bioinformatica

40 Operatori logici OperatoreEsempioAnalisi &&$s && $tVera solo se $s e $t sono vere and$s and $t ||$s || $tVera se $a è vera o $b è vera or$s or $t !! $mVera se $m non è vera notNot $m 40Bioinformatica

41 Circuito breve La valutazione di unespressione logica viene interrotta quando può essere determinata la verità (circuito breve): In questo caso se $a o $b è falsa, deve essere valutata la parte destra delloperatore or e il messaggio viene modificato. Se sia $a sia $b sono vere, loperatore or deve essere vero e non è necessario valutare la parte destra. $message = A e B sono entrambe vere. ($a and $b) or $message=A e B non sono entrambe vere 41Bioinformatica

42 Ancora sugli operatori logici Gli operatori logici di PERL non si limitano a restituire solo vero o falso. In realtà restituiscono lultimo valore valutato. Per es. lespressione 5 && 7 restituisce 7. Se $old è vera lespressione $new = $old è vera. Questo è più conciso di: $new=$old || default $new=$old; if (! $old) { $new=default; } 42Bioinformatica

43 Cicli while e for while (espressione) blocco For (inizializzazione; test; incremento) blocco $counter=0; while ($counter < 10) { print Still counting…$counter\n; $counter++; } for ($a=0; $a<10; $a=$a+2) { print a is now $a\n; } 43Bioinformatica

44 Disposizioni strane… Le istruzioni if possono usare un altro tipo di sintassi. Se allinterno del blocco if cè una sola espressione, questa può precedere le istruzioni if: diventa: if (test_espressione) { espressione; } espressione if (test_espressione); $correct=1 if ($guess == $question); Print No pi for you! if ($ratio != ); 44Bioinformatica

45 Controllo più preciso Listruzione last permette di uscire dal blocco più interno del ciclo in esecuzione: while($i<15) { last if ($i==5); # il ciclo termina quando $i vale 5 $i++; } for($i=0; $i<100; $i++) { for($j=0; $j<100; $j++) { if ($i * $j == 140) { print The product of $i and $j is 140\n; last; } } } 45Bioinformatica

46 Listruzione next Listruzione next riporta il controllo di nuovo nel ciclo e fa ricominciare literazione successiva del ciclo, se questo non è stato completato. Listruzione redo è simile a next a eccezione del fatto che la condizione non viene rivalutata e PERL riprende lesecuzione dallinizio del blocco senza controllare se la condizione di fine è soddisfatta o no. for($i=0; $i<100; $i++) { next if (not $i % 2); print An odd number=$i\n; } 46Bioinformatica

47 Etichette PERL consente di etichettare i blocchi e alcune istruzioni di ciclo (for, while): MIOBLOCCO: { } OUTER: while($expr) { INNER: while($expr) { statement; } 47Bioinformatica

48 Etichette e last, redo, next Le istruzioni last, redo e next possono prendere unetichetta come argomento. Così è possibile uscire da un blocco specifico. Normalmente non sarebbe possibile terminare un ciclo esterno da un ciclo interno, a meno di ricorrere a complicazioni del codice. Invece… OUTER: for($i=0; $i<100; $i++) { for($j=0; $j<100; $j++) { if ($i * $j == 140) { print The product of $i and $j is 140\n; last OUTER; } } } 48Bioinformatica

49 Uscire da PERL Quando PERL incontra unistruzione exit, lesecuzione del programma viene interrotta e PERL restituisce lo stato di uscita al sistema operativo. Uno stato di uscita 0 significa che tutto è andato bene: if ($user_response eq quit) { print Good bye\n; exit 0; } 49Bioinformatica

50 Liste Quando si desidera fare riferimento a molti oggetti in PERL, vengono usati gli elenchi. Esistono tre modi per rappresentare gli elenchi: usando liste, array e hash; Le liste rappresentano la forma più semplice di elenchi; una lista non è altro che un insieme di scalari; Ogni scalare nella lista prende il nome di elemento della lista; Le liste di PERL possono contenere qualsiasi numero di elementi scalari; 50Bioinformatica

51 Liste di letterali E facile inserire elementi in una lista di letterali: Questo esempio crea una lista di 4 elementi di diverso tipo. Se la lista contiene solo stringhe semplici e racchiudere ogni stringa tra apici singoli diventa troppo complesso, PERL offre una via più semplice, loperatore qw: (5, apple, $x, ) qw( apples oranges 45.6 $x ); # elementi separati da spazi 51Bioinformatica

52 Liste di letterali (2) Loperatore qw non esegue linterpolazione delle variabili su elementi che hanno laspetto di variabili; sono infatti gestiti in modo letterale; Quindi $x non è convertito al valore della variabile scalare $x; viene considerato come stringa contenente un simbolo del dollaro e la lettera x; 52Bioinformatica

53 Operatore di intervallo Loperatore di intervallo prende loperando sinistro (1) e loperando destro (10) e crea un elenco costituito da tutti i numeri tra 1 e 10, compresi. Una lista può contenere anche diversi intervalli: Assegnando alloperatore di intervallo un operando destro inferiore a quello sinistro, ad es. (10..1) viene creata una lista vuota. Lintervallo (a..z) genera una lista di 26 lettere minuscole, lintervallo (aa..zz) genera un elenco di 676 coppie di lettere: aa, ab, ac, ad, …, zx, zy, zz. (1..10) (1..10, ) 53Bioinformatica

54 Array Le liste di letterali sono usate generalmente per inizializzare altre strutture: un array o un hash. Per creare un array in PERL è sufficiente inserirvi degli elementi: Le assegnazioni di array implicano anche altri array o persino elenchi vuoti: Tutti gli elementi sono copiati in un nuovo array di conteneva altri elementi, questi saranno eliminati. Assegnare un elenco vuoto invece rimuove tutti gli elementi Greg Peter Bobby 54Bioinformatica

55 Array (2) Se una lista di letterali contiene altre liste, array o hash, questi elenchi saranno tutti compressi in una singola lista più grande: Questo array equivale Greg Peter Bobby Marcia Jan Cindy ( Mike, Carol ), Marcia Jan Cindy Greg Peter Bobby Mike Carol Alice); 55Bioinformatica

56 Array (3) Il lato sinistro di unassegnazione di array può essere una lista se contiene solo nomi di variabili. Lassegnazione di array inizializza le variabili nella lista: Se la lista a sinistra contiene un array, larray riceve tutti i valori rimanenti dal lato destro, qualunque sia la sua posizione nella lista: In questo caso $a è impostato a peaches. I frutti rimanenti nellelenco a destra sono assegnati a sinistra. $c è impostato a undef. Allo stesso modo se il lato sinistro contiene più variabili di quanti siano gli elementi a destra, le variabili rimanenti ricevono il valore undef. Se la lista a destra ha più elementi di quante siano le variabili a sinistra, i rimanenti vengono ignorati. ($a, $b, $c)=qw(apples oranges bananas); $c)=qw(peaches mangoes grapes cherries); 56Bioinformatica

57 Array (4) Come per sono array di default: Le Subroutines come default; Fuori dalle è larray di default, ed è usato per i parametri di input dalla linea di comando; 57Bioinformatica

58 Estrarre elementi da un array In questo modo è possibile ottenere i contenuti degli array: Larray viene interpolato e i suoi elementi vengono restituiti separati da spazi. Per accedere ai singoli elementi di un array si usa un indice numerico, che inizia col numero cedar maple apple); print $trees[0];# stampa oak print $trees[3];# stampa apple $trees[4]=pine; 58Bioinformatica

59 Porzioni Si può fare riferimento a un sottogruppo nellarray, di nome cedar maple apple cherry pine peach fir); Solo gli alberi da frutto Solo le conifere 59Bioinformatica

60 Trovare la fine di un array In questo modo viene visualizzato lindice dellultimo elemento, quindi 7; Modificando il valore di $#trees cambia anche la lunghezza dellarray: riducendolo si tronca, ingrandendolo vengono assegnati nuovi elementi di valore undef; Un altro metodo per trovare la dimensione cedar maple apple cherry pine peach fir); print $#trees; 60Bioinformatica

61 Array e indici negativi E possibile specificare anche indici negativi per gli array. La numerazione degli indici negativi inizia dalla fine dellarray e procede a ritroso. Per es. $array[-1] è lultimo elemento $array[-2] è il penultimo elemento e così via. 61Bioinformatica

62 Informazioni sul contesto Il contesto indica gli elementi che circondano un oggetto di interesse per definirne meglio il significato. Ad es. la parola livello può avere diversi significati in base al contesto: Lautomobile era ferma al passaggio a livello; Il programma si basa su un linguaggio di basso livello; Lacqua nella piscina arriva a livello della vita. E la stessa parola ripetuta più volte ma il significato è cambiato; Anche PERL è sensibile al contesto: le funzioni e gli operatori in PERL possono comportarsi in modo diverso in base al contesto in cui sono usati. 62Bioinformatica

63 Contesto (2) I due tipi più importanti di contesto in PERL sono il contesto elenco e il contesto scalare. Riferendoci alloperatore di assegnazione =, il tipo di espressione (elenco o scalare) sul lato sinistro delloperatore determina il contesto in cui sono valutati gli elementi sul lato destro: $a=$b; # Scalare a sinistra: il contesto è scalare # Array a sinistra: il contesto è elenco # Lista a sinistra: il contesto è elenco (viene assegnato il primo valore dellarray) # Scalare a sinistra: il contesto è scalare (size dellarray) 63Bioinformatica

64 Ancora su dimensione e fine di un array Osserviamo $a e $b nelle righe di codice seguenti: Alla fine del codice $a contiene il numero 4 e $b contiene il numero 3. Questo perché $a è valutato in un contesto scalare e contiene il numero di elementi. $b invece è impostato allindice dellultimo water cola juice lemonade ); $b=$#foo; print $a\n; print $b\n; 64Bioinformatica

65 Larray è vuoto A questo punto provare se un array contiene elementi diventa semplice: In è usato in un contesto scalare speciale di nome contesto booleano, ma si comporta allo stesso oats peas beans barley ); { print The array has elements!\n; } 65Bioinformatica

66 Contesto con operatori e funzioni A volte gli operatori si comportano in modo diverso, in base al contesto specifico; La funzione print prevede un elenco come argomento. Non è, tuttavia, importante il contesto specifico in cui è valutato lelenco; quindi stampare un array con print fa sì che larray sia valutato in un contesto elenco, visualizzandone gli elementi; Si può usare una pseudo-funzione speciale di nome scalar per forzare qualcosa a un contesto scalare: print # Stampa il numero di elementi di foo 66Bioinformatica

67 Ancora sul contesto La funzione chomp prende come argomento un array o uno scalare. Se chomp è usata con uno scalare, rimuove il separatore di record dalla fine dello scalare. Se è usata con un array, rimuove il separatore di record dalla fine di ogni scalare nellarray; Loperatore in un contesto scalare legge una riga di input dal terminale. In un contesto elenco legge tutto linput dal terminale e inserisce i dati nella lista: $a= ;# legge una riga in ; # legge tutto linput ($a)= ; # legge tutto linput nella lista assegnabile 67Bioinformatica

68 Contesto e operatore x Loperatore di ripetizione x ha un comportamento speciale nel contesto elenco. Se loperando sinistro è racchiuso in parentesi e loperatore stesso è usato in un contesto elenco, restituisce una lista delloperatore sinistro (*) x 100; # array di 100 asterischi 68Bioinformatica

69 Contesto e operatore virgola Finora le virgole sono state usate per separare gli elementi di liste di letterali: In un contesto scalare la virgola è un operatore che valuta ogni elemento da sinistra a destra e restituisce il valore dellelemento più a destra: Il lato destro dellespressione è valutato in un contesto scalare a causa dello scalare $last_pet a sinistra. Il risultato è che $last_pet è impostato uguale a dog, fish, canary, iguana); $last_pet =(cat, dog, fish, canary, iguana); 69Bioinformatica

70 Contesto e funzione localtime In un contesto scalare la funzione localtime restituisce una stringa ben formattata con lora corrente: In un contesto elenco, localtime restituisce una lista di elementi che descrivono lora corrente: print scalar(localtime); # stampa ad es. Thu Nov 03 23:00: ($sec, $min, $hour, $mday, $mon, $year_off, $wday, $yday, $isdst)=localtime; 70Bioinformatica

71 Localtime CampoValore $secSecondi, 0-59 $minMinuti, 0-59 $hourOra, 0-23 $mdayGiorno del mese, 1-28,29,30 o 31 $monMese dellanno, 0-11 $year_offNumero degli anni dal 1900 (Per lanno corretto a quattro cifre aggiungere 1900 a questo numero) $wdayGiorno della settimana, 0-6 $ydayGiorno dellanno, o 365 $isdstVero se è in vigore lora legale 71Bioinformatica

72 Esaminare un array Iterazione dellarray: PERL offre una maniera più semplice per fare la stessa chocolate vanilla strawberry mint sherbet ); For($index=0; $index++) { print My favorite flavor is $flavors[$index] and… } print many others.\n; foreach $cone { print Id like a cone of $cone\n; } 72Bioinformatica

73 Ancora foreach Literatore non è solo una variabile a cui è assegnato il valore di ogni elemento nella lista; in realtà si riferisce proprio allelemento della lista. Modificando literatore, lelemento corrispondente nella lista rimane modificato dopo lesecuzione del ciclo: foreach $flavor { print Id like a bowl of $flavor ice cream, please.\n; $flavor = $flavor (Ive had some); } print The available flavors are\n; foreach $flavor { print $flavor\n; } 73Bioinformatica

74 Conversione fra array e scalari Un metodo per convertire uno scalare in un array è la funzione split, che prende un pattern e uno scalare, usa il pattern per dividere lo scalare e restituisce una lista dei pezzi: Il pattern è stato racchiuso tra slash / /. Si ottengono le parole che compongono la frase, senza spazi. Se non si specifica un secondo argomento, la variabile $_ viene divisa. Se non si specifica un pattern o una stringa, si usa uno spazio bianco per dividere la variabile $_. Il pattern nullo //, divide lo scalare in singoli /, The quick brown fox); while( ) { ($firstchar)=split(//,$_); print The first character was $firstchar\n; } 74Bioinformatica

75 Ancora split Quando si divide uno scalare in cui ogni sezione è un elemento distinto è più semplice distinguere le diverse sezioni quando si assegna un nome ad ogni Album, Beatles, Graceland, Paul Simon, A boy named Sue, Goo Goo Dolls); foreach $record { ($record_name, $artist)=split(,, $record); } 75Bioinformatica

76 Creare scalari da array (Join) join prende una stringa e una lista, unisce gli elementi della lista usando la stringa come separatore e restituisce la stringa risultante: Questo esempio assegna la stringa 1,2,3,4,5,6,7,8,9,10 a $numbers; E possibile usare split e join per dividere una stringa e ricomporla simultaneamente: Qui $message è diviso in una lista con split. La lista è usata dalla funzione join e ricomposta con trattini; $numbers=join(,, (1..10)); $message=Elvis was here; print The string \$message\ consists of:, join(-, split(//, $message)); 76Bioinformatica

77 Riordinare larray PERL offre la funzione sort, che prende come argomento la lista e la ordina in ordine alfabetico. Larray originale non viene toccato: Lordine predefinito è quello ASCII per cui tutte le parole che iniziano con caratteri maiuscoli sono ordinate prima delle parole che iniziano con lettera minuscola. Output: Bush Carter Clinton Ford Nixon Regan Clinton Bush Reagan Carter Ford Bush Reagan Carter Ford Nixon); print join(, \n; print \n; 77Bioinformatica

78 Ancora sort La funzione sort consente di scegliere lordinamento desiderato usando un blocco di codice (o un nome di subroutine) come secondo argomento; Nel blocco, due variabili, $a e $b, sono impostate a due elementi dellelenco. Il compito del blocco è restituire -1, 0 o 1 in base a se $a è inferiore a $b, uguale a $b o maggiore di {return(1) if ($a>$b); return(0) if ($a==$b); return(-1) if ($a<$b); 78Bioinformatica

79 Loperatore astronave Un modo più semplice per ottenere lo stesso risultato si ha usando loperatore astronave : restituisce -1 se loperando sinistro è inferiore a quello destro, 0 se i due operandi sono uguali, 1 se loperando sinistro è maggiore di quello destro: Per confrontare stringhe alfabetiche si utilizza loperatore cmp, che funziona allo stesso = sort { $b $a } 1.. = sort { $a $b } 1.. 9; 79Bioinformatica

80 La funzione reverse La funzione reverse, quando prende un valore scalare in un contesto scalare, inverte i caratteri della stringa e restituisce la stringa invertita: Quando prende una lista in un contesto elenco, reverse restituisce gli elementi della lista in ordine inverso: E in questo caso? print reverse(Perl);# visualizza do not like green eggs and ham); print join(, print join(, reverse 80Bioinformatica

81 I file Per leggere o scrivere un file in PERL è necessario aprire un filehandle; I filehandle in PERL rappresentano un altro tipo di variabile: agiscono come riferimento fra il programma e il SO e contengono informazioni su come è stato aperto il file e fino a che punto si è arrivati con la lettura (o scrittura), oltre che agli attributi relativi a lettura e scrittura del file definiti dallutente; Il filehandle viene fornito automaticamente da PERL allavvio del programma e, in genere, è collegato alla tastiera; Il formato dei nomi dei filehandle è lo stesso di quello dei nomi delle variabili, tranne che per lassenza di simboli $ Per questo motivo si consiglia di scrivere i nomi dei filehandle in maiuscolo, per evitare conflitti con parole chiave di PERL. 81Bioinformatica

82 Aprire un file Se la funzione fallisce restituirà il valore undef: open(filehandle, nomepercorso); If (open(MYFILE, mydatafile)) { # etc etc } else print Cannot open mydatafile!\n; exit 1; } 82Bioinformatica

83 La funzione die In molti programmi la sintassi Apertura o fallimento di un file viene scritta usando la funzione die: Se lapertura del file non riesce viene interrotta lesecuzione e linterprete restituisce un messaggio di errore; Per chiudere un file: open (MYTEXT, novel.txt) || die; close(MYTEXT); 83Bioinformatica

84 Nomi di percorso Quando si cerca di aprire un file senza specificare la directory, PERL suppone che il file si trovi nella directory corrente; Per aprire un file che si trova in unaltra directory è necessario usare un nome di percorso. In UNIX: In Windows i nomi di percorso contengono backslash come separatori, e usando questi simboli in una stringa tra doppi apici in PERL la sequenza di caratteri viene tradotta in un carattere speciale: open(MYFILE, /usr/pierce/novel) || die; open(MYFILE, \Windows\users\pierce\novel.txt) || die; 84Bioinformatica

85 Nomi di percorso (2) Un metodo corretto per aprire il file è sottoporre ogni backslash a escape con un altro backslash: Questo è corretto ma confuso. Potremmo eliminare i doppi backslash usando la funzione qq; In PERL è possibile però usare lo slash / per separare gli elementi del percorso: open(MYFILE, C:\\Windows\\users\\pierce\\novel.txt) || die; open(MYFILE, C:/Windows/users/pierce/novel.txt) || die; 85Bioinformatica

86 Ancora sulla funzione die La funzione die può prendere anche un elenco di argomenti e stamparli al posto del messaggio predefinito. Se il messaggio non è seguito da un carattere di nuova riga, viene aggiunto at nomescript line xxx alla fine: die Cannot open; # stampa Cannot open at nomescript line xxx die Cannot open!\n; # stampa Cannot open! 86Bioinformatica

87 La variabile $! La variabile $! è sempre impostata al messaggio di errore dellultima operazione richiesta del sistema. Usata in un contesto numerico $! restituisce un numero di errore; In un contesto stringa $! restituisce un messaggio di errore appropriato dal SO: Se il codice fallisce il messaggio stampa qualcosa di simile a Cannot open myfile: a file or directory in the path does not exist; Se si vuole solo un messaggio di avviso, anziché bloccare il programma: open(MYFILE, myfile) || die Cannot open myfile: $!\n; If (! Open(MYFILE, myfile)) { warn cannot read myfile: $!;} 87Bioinformatica

88 Leggere dal file In un contesto scalare, loperatore angolare legge una riga di input dal file e, una volta finito il file, restituisce il valore undef; Per leggere e stampare il file: Se gli operatori angolari sono gli unici elementi allinterno dellespressione condizionale di un ciclo while, PERL assegna automaticamente la riga di input alla variabile speciale $_: open (MYFILE, myfile) || die Cant open my file: $!; $line= ; while (defined($a= )) { print $a; } while ( ) { print $_; } 88Bioinformatica

89 Leggere dal file (2) Ogni riga di dati letta dal file comprende anche il carattere di end-of-line. Se si vuole solo il testo, usare la funzione chomp; In un contesto elenco, gli operatori angolari leggono lintero file e lo assegnano alla lista: In questo caso i dati del filehandle MYFILE sono letti e assegnati $contents[0] conterrà la prima riga del file, $contents[1] la seconda etc. open(MYFILE, novel.txt) || die ; close(MYFILE); 89Bioinformatica

90 Scrivere sul file Nel primo caso, il simbolo > indica a PERL che il file specificato deve essere sovrascritto coi nuovi dati e che filehandle è aperto per la scrittura; Nel secondo caso, il simbolo >> indica a PERL di aprire il file per la scrittura, ma se il file esiste già i contenuti non devono essere cancellati; i nuovi dati saranno accodati alla fine del file; Per scrivere sul file: dove LIST è una lista di cose che si desidera scrivere. open(filehandle, >nomepercorso); open(filehandle, >>nomepercorso); print filehandle LIST 90Bioinformatica

91 Scrivere sul file (2) E possibile aprire più filehandle per la lettura e la scrittura allo stesso tempo: Ma la stessa cosa si ottiene così: open(SOURCE, sourcefile) || die $!; open(DEST, >destination) || die ; print close(DEST); close(SOURCE); print DEST ; 91Bioinformatica

92 Filehandle liberi Allavvio di ogni programma PERL vengono aperti tre filehandle liberi, STDIN, STDOUT e STDERR; STDIN è di base associato alla tastiera; STDOUT e STDERR sono di base associati allo schermo; 92Bioinformatica

93 File binari Quando si scrivono dati binari – file GIF, file EXE, documenti WORD, etc. – è necessario usare la funzione binmode per contrassegnare il filehandle come binario: open(FH, >camel.gif) || die $!; binmode(FH); print FH GIF87a\056\001\045\015\000; close(FH); 93Bioinformatica

94 Operatori di test di file X è il test particolare che si intende eseguire, mentre filehandle è il filehandle da verificare; La stessa cosa si può ottenere con un nomepercorso senza aver un filehandle aperto; -X filehandle -X nomepercorso 94Bioinformatica if(-e "myfile.txt") { open (MYFILE, "myfile.txt") || die "Cant open my file: $!"; while (defined($a= )) { print $a; } else { print "il file non esiste"; }

95 Operatori di test di file (2) OperatoreEsempioRisultato -r-r fileVero se file è leggibile -w-w $aVero se il nome del file contenuto in $a è scrivibile -e-e myfileVero se myfile esiste -z-z dataVero se data esiste ma è vuoto -s-s dataDimensione di data in byte, se esiste -f-f novel.txtVero se novel.txt è un file regolare invece che una directory -d-d /tmpVero se /tmp è una directory -T-T unknownVero se unknown è un file di testo -B-B unknownVero se unknown è un file binario -M-M fooNumero di giorni da quando il file foo è stato modificato dopo lavvio del programma 95Bioinformatica

96 Esercizi Proposti Realizzare gli script per risolvere i seguenti problemi: Calcolare i primi n numeri primi; Contare le righe di un file di testo; Contare il numero di occorrenze di una certa parola p in un file di testo; Dato un file di testo con n righe generare una pagina html che contenga una tabella centrata con 2 colonne ed n righe in modo che: Nella colonna 1 di ogni riga compaia il numero di riga (progressivo); Nella colonna 2 compaiano le righe del file di testo; Il testo sia in LOWERCASE e UPPERCASE a righe alterne; 96Bioinformatica


Scaricare ppt "Bioinformatica Linguaggio Perl (1) Dr. Giuseppe Pigola – Dr. Alessandro Laganà –"

Presentazioni simili


Annunci Google