350 likes | 451 Views
ESERCIZIO. Dato un programma con la sola istruzione: $a=“Hasta la vista!”. Quanto vale length($a) ?. 15. substr($a,0) ?. Hasta la vista!. substr($a,$b) ?. Hasta la vista!. length(substr($a,$c,1) ) ?. 1 (ovvio!). substr($a,lenght($a)-1) ?. !. index ($a,’ ‘) ?. 5. -1.
E N D
ESERCIZIO • Dato un programma con la sola istruzione: • $a=“Hasta la vista!” Quanto vale length($a) ? 15 substr($a,0) ? Hasta la vista! substr($a,$b) ? Hasta la vista! length(substr($a,$c,1) ) ? 1 (ovvio!) substr($a,lenght($a)-1) ? ! index ($a,’ ‘) ? 5 -1 index ($a,’ ‘) ? BIOINFO3 - Lezione 38
ESERCIZIO (TIPO ESAME?) • Dato un programma con la sola istruzione: • $a=10; Quanto valgono $b e $a dopo $b=++$a; ? $a=11 e $b=11 Quanto valgono $b e $a dopo un ulteriore $b=$a++; ? $a=12 e $b=11 Quanto vale $c dopo $c=“Formula $b”; ? $c=“Formula 11” Quanto vale $d dopo $d=‘Formula $b’; ? $d=“Formula $b” Quanto vale $c dopo $c.=$d ? $c=“Formula 11 Formula $b” BIOINFO3 - Lezione 38
ESERCIZIO (TIPO ESAME?) • Quante volte viene eseguito il seguente ciclo? Quali numeri stampa? • for ($i=0;$i<10;$i){ • print “$i\n”; • } Il ciclo non termina mai perché $i non viene mai modificata e non sarà mai > o = a 10. Stampa una colonna interminabile di 0, finchè non viene ucciso con ^C Quante volte viene eseguito il seguente ciclo? Quali numeri stampa? for ($i=0;$i<10;$i++){ print “$i\n”; $i++; } Stampa i numeri pari da 0 a 8. Il ciclo è eseguito 5 volte! Primo ciclo $i=0 e alla fine del ciclo $i=2 … Quinto ciclo $i=8 e alla fine $i=10; BIOINFO3 - Lezione 38
ESERCIZIO • Leggere un file di sequenze EST in formato FASTA. Considerare solo le righe che contengono il pattern “>gi|numero”. Inserire in un array questi numeri. Copiare l’array in altri 2 array. Eseguire un ciclo su tutti gli elementi di questi 2 array incrementando di 1 tutti i numeri del primo e raddoppiando tutti i numeri del secondo BIOINFO3 - Lezione 38
Il pattern che ci interessa è descritto dall’espressione regolare • /^>gi\|(\d+)/ • Ovvero tutte le stringhe che iniziano con > seguito da gi e da un | (ricordarsi di anteporre \ davanti a |, altrimenti conserva il suo significato di alternativa). Segue quindi un numero di almeno una cifra. • Ci interessa catturare questo numero, pertanto racchiudiamo il pattern relativo tra parentesi. In esecuzione ritroveremo la parte di stringa che soddisfa il pattern tra parentesi nella variabile di perl $1. N.B. Non è possibile fare assegnamenti a $1. Se avessimo avuto altri pattern tra parentesi li ritroveremo in $2, $3, ecc… /^>gi\|(\d+)/ >gi|8777287|gb|AB044776.1| $1=“8777287” BIOINFO3 - Lezione 38
Notare come $1, se la riga letta ($r) contiene il pattern descritto dall’espressione regolare, sia aggiunto alla lista @lista. BIOINFO3 - Lezione 38
Il pattern è ritrovato nella stringa $r, quindi ( $r=~ /^>gi\|(\d+)/ ) è VERA e si entra dentro all’if per eseguire la push BIOINFO3 - Lezione 38
Per queste tra altre righe lette successivamente il pattern descritto dall’espressione regolare non viene trovato (infatti non iniziano con il maggiore, non contengono gi| ed un numero). Quindi l’espressione ( $r=~ /^>gi\|(\d+)/ ) è FALSA e non si entra nell’if per eseguire la push. BIOINFO3 - Lezione 38
BREAKPOINT NEL DEBUGGER Fissa un breakpoint alla riga 11 Nel debugger si possono fissare dei “breakpoint”, tipicamente quando si devono eseguire dei cicli molto lunghi e non vogliamo premere decine o centinaia di volte il tasto invio. b numero-di-linea Fissa un breakpoint alla riga dal numero specificato c Fa procedere il programma fino al prossimo breakpoint L’esecuzione fino al breakpoint ci posiziona alla fine del ciclo di lettura delle righe del file. Si può notare il contenuto dell’array @lista a fine del ciclo (22 elementi) BIOINFO3 - Lezione 38
L’assegnamento ai 2 array @p e @d crea 2 array identici a @lista, anch’essi di $n elementi (con indice da 0 $n-1) BIOINFO3 - Lezione 38
$p[$i] prima … …e dopo $d[$i] prima … …e dopo? Perché non viene il doppio? Ora viene eseguito un ciclo, controllato dalla variabile $i sui $n elementi dei array @p e @d. All’interno del ciclo viene incrementato di 1 l’i-esimo elemento di @p ($p[$i]) e raddoppiato l’i-esimo elemento di @d ($d[$i]) BIOINFO3 - Lezione 38
Dando un altro comando “c” al debugger facciamo ripartire l’esecuzione. Non essendoci altri break-point settati dopo la riga 11, l’esecuzione procede fino alla fine del programma. Notare la stampa dei tre array come desiderato. BIOINFO3 - Lezione 38
ESERCIZIO • Passare al programma un argomento. Verificare che l’argomento sia esattamente uno, altrimenti far morire il programma con un messaggio d’errore. • L’argomento è il nome di un file di nomi da aprire in lettura. Se il file non esiste far morire il programma con un messaggio d’errore. • Leggere con un ciclo while le righe del file una alla volta fino alla fine del file, inserendo le righe in coda ad una lista. • Stampare la lista ordinata, un elemento per riga (ciclo con l’istruzione foreach) in un file aperto in scrittura assegnandogli un nome uguale a quello letto, con in più il suffisso “.ord” BIOINFO3 - Lezione 38
$ARGV[0] $ARGV[1] nomi 1 @ARGV • Vediamo passo passo l’esecuzione del programma. L’array @ARGV contiene gli argomenti passati da linea di comando (N.B. non i nomi dei file di redirezione) @ARGV in un contesto scalare (!=1) vale 2, che è diverso da 1 e quindi si entra nell’if che termina il programma BIOINFO3 - Lezione 38
Ora @ARGV=(“nominonesiste”) BIOINFO3 - Lezione 38
Ora @lista=(“Marta”,”Anna”) BIOINFO3 - Lezione 38
Ora @lista=(“Marta”,”Anna”,”Lucia”) BIOINFO3 - Lezione 38
Alla fine della lettura delle righe del file @lista=(“Marta”,”Anna”,”Lucia”,”Elda”,”Irma”,”Sonia”) La lettura successiva restituisce la stringa vuota ($riga=<I>=“”) cioè falso e quindi si esce dal while BIOINFO3 - Lezione 38
Dopo l’istruzione di sort @lista=(“Anna”,” Elda”,” Irma”, ”Lucia”,” Marta”,”Sonia”) Si apre quindi il file nomi.ord in scrittura (viene creato se non esiste) associandolo alla handle O O nomi.ord BIOINFO3 - Lezione 38
2 1 3 @lista=(“Anna”,” Elda”,” Irma”, ”Lucia”,” Marta”,”Sonia”) Il foreach esegue un ciclo per ogni elemento della lista quindi farà 6 cicli. In ogni ciclo $a prende il valore di uno degli elementi della lista. Le istruzioni di print sono eseguite sulla handle O e quindi sul file “nomi.ord” BIOINFO3 - Lezione 38
4 5 6 Terminati i 6 cicli il foreach termina non trovando più altri elementi in @lista Si può poi verificare il contenuto del file nomi.ord BIOINFO3 - Lezione 38
Matteo Marco Luca 3 1 6 %freq ESEMPIO (Esercitazione 5 – es. 3) • Leggere un file di nomi (uno per riga) e stampare la frequenza dei nomi (quante volte compare ogni nome). Suggerimento: usare un array associativo avente come indici i nomi e come valori la frequenza L’array associativo è indicato come %freq nel suo complesso. Quanto vale $freq{Matteo}? 1 3 Quanto vale $freq{Marco}? Quanto vale $freq{Giovanni}? 0 oppure la stringa vuota (dipende dal contesto) Quanto vale keys (%freq) ? (“Marco”,”Matteo”,”Luca”) Quanto vale sort ( keys (%freq)) ? (“Luca”,” Marco”,” Matteo”) BIOINFO3 - Lezione 38
$riga dopo il chop vale “Luca” $freq{$riga}=$freq{Luca}=0 $freq{$riga}++ equivale a $freq{$riga}= $freq{$riga}+1 $freq{Luca}++ equivale a $freq{Luca}=$freq{Luca}+1=0+1=1 Luca 1 %freq BIOINFO3 - Lezione 38
Luca Marco 2 1 %freq BIOINFO3 - Lezione 38
Alla fine del ciclo di lettura Luca Matteo Marco 5 1 3 %freq BIOINFO3 - Lezione 38
ESEMPIO (Esercitazione 6 – Esercizio 2) • Leggere tutti i nomi dei file della directory corrente, inserirli in una lista solo se non contengono il carattere “.”. Ordinare e stampare la lista (un nome per riga) Il file . indica la directory corrente Il file .. indica la directory padre della corrente L’opendir è l’equivalente della open per le directory anziche per i file normali I nomi dei file contenuti nella directory vengono letti con la funzione readdir anziché con < >, sempre facendo riferimento alla handle con cui abbiamo aperto la directory BIOINFO3 - Lezione 38
Pattern matching: VERO se $f non contiene punti. /\./ indica tutte le stringhe che contengono punti Con !~ il pattern matching è VERO se la stringa $f non contiene punti (si fa il not della condizione) Il primo file letto è “.” che però non verifica la condizione dell’if. Analogamente per il secondo: “..” BIOINFO3 - Lezione 38
Poi si continua a ciclare. Tutti i file $f che contengono “.” non fanno entrare nell’if BIOINFO3 - Lezione 38
Dopo molti cicli in cui vengono letti file contenenti un punto finalmente si trova un file, “sequenze” senza il punto che viene inserito nell’array @lista BIOINFO3 - Lezione 38
Finalmente si riesce a terminare l’elenco dei file e quindi a far diventare falsa l’istruzione $f=readdir(D). A questo punto @lista contiene 7 nomi di file: (“sequenze”, “nomi”, “numeri”, “nomi1”, “nomi2”, “seqfasta”, “nn”) BIOINFO3 - Lezione 38
1 2 3 4 5 Dopo l’esecuzione della sort @lista contiene diventa: (“nn”, “nomi”, “nomi1”, “nomi2”, “numeri”, “seqfasta”, “sequenze” ) Si eseguono quindi 7 cicli col foreach usando la variabile $f come indice del ciclo. $f viene in ogni ciclo stampata sullo STDOUT ovvero a video BIOINFO3 - Lezione 38
6 7 Al termine del programma avremo BIOINFO3 - Lezione 38