ESERCIZIO Esercizio. Leggere delle sequenze di DNA (una per riga, a partire da inizio riga) e stampare solo le sequenze lunghe più di 20 basi. Versione compatta BIOINFO3 - Lezione 26 1 ESERCIZIO Esercizio. Leggere in redirezione un file di sequenze di DNA (una per riga, a partire da inizio riga) e stampare la lunghezza minima, massima e media delle sequenze. Versione compatta BIOINFO3 - Lezione 26 2 DEBUGGER Il Perl offre la possibilità di osservare passo per passo l’esecuzione dei propri programmi per verificarne la correttezza e scoprirne eventuali errori “di progettazione”. Si tratta di richiederne l’esecuzione mediante un DEBUGGER Il debugger si può attivare in due modi diversi: •perl –d nomeprogramma •aggiungendo nella prima riga del programma (quella con #!/usr/bin/perl) l’opzione -d Una volta all’interno del debugger si possono usare i comandi h help-per vedere l’elenco dei comandi q quit-per uscire dal debugger s step-per eseguire l’istruzione corrente (basta darlo la prima volta, per poi proseguire con il tasto di INVIO) p print-per stampare il valore di una variabile BIOINFO3 - Lezione 26 3 OPERAZIONI SUI FILE Perl permette di leggere o scrivere direttamente su un file, anche senza utilizzare la redirezione. Abbiamo visto che la redirezione opera al di fuori del programma cambiandone l’input e/o l’output e che ciò è completamente trasparente al programma il quale crede comunque di leggere da STDIN e scrivere su STDOUT. programma <file-input >file-output programma file-input BIOINFO3 - Lezione 26 file-output 4 HANDLE STDIN e STDOUT sono delle handle, cioè delle variabili particolari (il cui nome non inizia per $) che fanno riferimento ad un file. Nelle operazioni di input di una riga < > e di print normalmente si specifica l’handle con cui effettuare l’operazione. <HANDLE1> print HANDLE2 “…”; input dal file associato all’handle HANDLE1 output sul file associato all’handle HANDLE2 N.B. HANDLE1 e HANDLE2 indicano 2 nomi generici di handle ad as. I, O, A, PIPPO, FILE_INPUT, FILE_OUTPUT Se non è specificata alcuna handle (come abbiamo sempre fatto sinora!) l’input avviene da STDIN e l’output su STDOUT < > print “…”; BIOINFO3 - Lezione 26 è equivalente a <STDIN> è equivalente a print STDOUT “…..”; 5 HANDLE Il seguente schema esemplifica in generale gli input e output di un programma file1 HANDLE1 programma ? ? file-input HANDLE2 file-output file2 BIOINFO3 - Lezione 26 6 APERTURA DEL FILE Per poter scrivere o leggere un file è innanzitutto necessario aprirlo ed associarlo ad una handle. Dopodichè in ogni operazione di input o print relativa a quel file si dovrà fare riferimento a quella handle. open (I,”pippo”); open (I,”<pippo”); Apre il file di nome ‘pippo’ in lettura, associandolo alla handle di nome I. Se il file non esiste l’istruzione restituisce il valore falso (0) open (O,”>pluto”); Apre il file di nome ‘pluto’ in scrittura, associandolo alla handle di nome O. Se il file non esiste viene creato, se esiste già esso viene sovrascritto open (A,”>>topolino”); Apre il file di nome ‘topolino’ in scrittura, associandolo alla handle di nome A. Se il file non esiste viene creato, se esiste già lo si scriverà in coda alla parte già esistente BIOINFO3 - Lezione 26 7 APERTURA DEL FILE Supponiamo di avere eseguito le tre istruzioni open: open (I,”<pippo”); open (O,”>pluto”); open (A,”>>topolino”); programma A questo punto è possibile: I O A Leggere dal file “pippo” usando la handle I <I> Scrivere sul file “pluto” (svuotato, se già esistente) print O “………”; Scrivere sul file “topolino” (in coda al file) print A “………”; pippo topolino pluto BIOINFO3 - Lezione 26 8 OUTPUT Esempi di istruzioni print su differenti handle. Notare l’effetto dei due differenti tipi di open in scrittura sui file nomi1 e nomi2 PRIMA DOPO BIOINFO3 - Lezione 26 9 INPUT Esempio. Programma che riceve come argomento (nella linea di comando) il nome del file da aprire. Se il file esiste ne legge le righe e le stampa. Notare l’or (||). Solo se falsa la open (ovvero file non apribile: non esiste o non si ha il diritto di leggerlo) si esegue il comando die Vedremo ora alcuni esempi di esecuzione BIOINFO3 - Lezione 26 10 INPUT Esempi di esecuzione. Nel primo caso l’array @ARGV è vuoto (nessun argomento). Quindi @ARGV in un contesto scalare (@ARGV!=1) vale 0 e @ARGV!=1 è falsa. Viene eseguita subito l’istruzione die che fa terminare il programma E’ chiaro il concetto di contesto scalare o contesto array? Ad esempio: @a+1 @a==1 @b=@a @a>0 ($a,@b)=@a ($a,$b)=@a BIOINFO3 - Lezione 26 11 INPUT Esempi di esecuzione. Nel secondo caso argomento: “nomi”. si passa un solo Quindi @ARGV=(“nomi”) e @ARGV in un contesto scalare ora vale 1. Il die non è eseguito perché la condizione dell’if ora è falsa $file=$ARGV[0]=“nomi” Si apre il file “nomi” ($file=“nomi”) in lettura associandolo alla handle F Si iniziano a leggere le righe del file “nomi”. Nel primo ciclo $r=“Marta\n”; Nel secondo $r=“Anna\n”; ……. Fatti 6 cicli $r=<F> diventa falso perché arrivati a fine file BIOINFO3 - Lezione 26 12 RIEPILOGO •Debugger •Input e output su file BIOINFO3 - Lezione 26 13