SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma piu` grande, che svolge una specifica funzione ed e` relativamente indipendente dal resto del codice. Una subroutine in Perl è definita dalla parola chiave sub sub nome-della-subroutine { istruzioni della subroutine } Per eseguire la subroutine da qualunque punto del programma è sufficiente scrivere: &nome-della-subroutine; N.B. Quando il programma incontra la definizione della subroutine non la esegue! Le definizioni di subroutine tipicamente si collocano alla fine del programma, ma nulla ci vieta di metterle in qualunque posizione, eventualmente anche all’inizio BIOINFO3 - Lezione 33 1 ESEMPIO BIOINFO3 - Lezione 33 2 ESEMPIO Abbiamo verificato che le due subroutine “testa” e “coda” sono eseguite solo quando invocate e non anche al momento della loro definizione. BIOINFO3 - Lezione 33 3 DEBUGGER: “S” Osserviamo l’esecuzione passo passo del programma dal debugger usando il comando S (step) per avanzare da una riga alla successiva Usando il comando S del debugger si “entra” nelle subroutine e vengono mostrate tutte le istruzioni eseguite all’interno della subroutine. E’ evidenziato anche il nome della subroutine che si sta eseguendo (circoletto verde) BIOINFO3 - Lezione 33 4 DEBUGGER: “N” Osserviamo invece l’esecuzione passo passo del programma dal debugger usando il comando N (next) Usando il comando N del debugger non viene mostrato il dettaglio dell’esecuzione di tutte le istruzioni delle subroutine! Le subroutine vengono mostrate dal debugger come un’unica istruzione (la chiamata della subroutine). BIOINFO3 - Lezione 33 5 FUNZIONI Sono delle subroutine che restituiscono al programma chiamante un valore, di solito dipendente dai parametri passati dal programma alla subroutine. La chiamata di una funzione può quindi essere essere utilizzata come un valore (essa restituisce un valore!) in qualunque espressione. Ad esempio potrà essere assegnato ad una variabile o usato in espressioni complesse: $a=&media(20,30); $b=&media(&media($a,28),24)+12; Supponiamo che “media” sia una funzione (subroutine che restituisce un valore) che calcola la media dei due parametri ricevuti: sub media{ ($a,$b)=@_; # I parametri passati alla sub sono contenuti in @_ $media=($a+$b)/2; return $media; } BIOINFO3 - Lezione 33 6 FUNZIONI E’ importante fare attenzione alle variabili usate nelle subroutine. Si corre infatti il rischio di usare delle variabili già utilizzate dal programma e di andare a modificarne il valore, con conseguenze devastanti (problema dei “side effect”, effetti collaterali). Per questo è buona norma dichiarare le variabili delle subroutine come “locali” alla subroutine (nel nostro esempio: local ($a,$b)=@_ oppure my ($a,$b)=@_ ). Anche se si usa un nome di variabile già utilizzato nel programma, nella subroutine viene creata una nuova istanza di quella variabile, accessibile solo dalla subroutine, che è poi rimossa alla fine dell’esecuzione della subroutine stessa. L’array @_ (in modo simile all’array @ARGV) contiene i parametri passati alla funzione. E’ essenziale l’esecuzione dell’istruzione “return” che provoca effettivamente la fine della subroutine e la trasmissione del valore specificato. Ad esempio potremo avere degli if con dei “return” in punti diversi della subroutine in cui a seconda di determinate condizioni vengono ritornati valori diversi. BIOINFO3 - Lezione 33 7 ESEMPIO BIOINFO3 - Lezione 33 8 ESEMPIO Notare che $a e $b non sono state modificate dalla funzione! BIOINFO3 - Lezione 33 9 CHIAMATA DI PROGRAMMI ESTERNI Esistono 3 diversi modi di chiedere l’esecuzione di un programma esterno da un programma Perl. system “comando-unix”; exec “comando-unix”; qx {comando-unix}; L’istruzione system interrompe l’esecuzione del programma, esegue il comando unix specificato e al termine di quest’ultimo esegue l’istruzione successiva alla system e quindi ritorna il controllo al programma. L’istruzione exec invece termina l’esecuzione del programma Perl e lancia l’esecuzione del comando unix specificato. L’istruzione qx è sicuramente la più utile poiché restituisce sotto forma di stringa lo standard output prodotto dall’esecuzione del comando unix. La stringa tipicamente sarà assegnata ad un’altra variabile. BIOINFO3 - Lezione 33 10 ESEMPIO BIOINFO3 - Lezione 33 11 ESEMPIO Programma che restituisce i codici genbank delle est contenute nel file passato come argomento Proviamo ora a chiamare il programma (che restituisce i codici così come li trova nel file, e quindi non ordinati) da un altro, ad esempio proprio per ordinare i codici BIOINFO3 - Lezione 33 12 ESEMPIO BIOINFO3 - Lezione 33 13 ESERCIZIO Scrivere una subroutine leggi che: scrive in output il messaggio ricevuto come parametro, legge da input una stringa, rimuove il carattere finale di a capo e restituisce la stringa letta. Chiamare la subroutine 3 volte dal programma: “Inserire il proprio nome” e assegnare il valore della funzione a $nome “Inserire il proprio cognome” e assegnare il valore della funzione a $cog “Inserire la propria età” e assegnare il valore della funzione a $anni Stampare $nome, $cognome, $anni BIOINFO3 - Lezione 33 14 ESERCIZIO BIOINFO3 - Lezione 33 15 RIEPILOGO •Definizione e chiamata di subroutine in Perl •Funzioni •Chiamata di programmi esterni in Perl BIOINFO3 - Lezione 33 16