BIOINFO3 - Lezione 331 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 allinizio
BIOINFO3 - Lezione 332 ESEMPIO
3 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 334 DEBUGGER: S Osserviamo lesecuzione 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 allinterno della subroutine. E evidenziato anche il nome della subroutine che si sta eseguendo (circoletto verde)
BIOINFO3 - Lezione 335 DEBUGGER: N Osserviamo invece lesecuzione passo passo del programma dal debugger usando il comando N (next) Usando il comando N del debugger non viene mostrato il dettaglio dellesecuzione di tutte le istruzioni delle subroutine! Le subroutine vengono mostrate dal debugger come ununica istruzione (la chiamata della subroutine).
BIOINFO3 - Lezione 336 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{ # I parametri passati alla sub sono contenuti $media=($a+$b)/2; return $media; }
BIOINFO3 - Lezione 337 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 oppure my ). 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 dellesecuzione della subroutine stessa. (in modo simile contiene i parametri passati alla funzione. E essenziale lesecuzione dellistruzione 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 338 ESEMPIO
9 ESEMPIO Notare che $a e $b non sono state modificate dalla funzione!
BIOINFO3 - Lezione 3310 CHIAMATA DI PROGRAMMI ESTERNI Esistono 3 diversi modi di chiedere lesecuzione di un programma esterno da un programma Perl. system comando-unix; exec comando-unix; qx {comando-unix}; Listruzione system interrompe lesecuzione del programma, esegue il comando unix specificato e al termine di questultimo esegue listruzione successiva alla system e quindi ritorna il controllo al programma. Listruzione exec invece termina lesecuzione del programma Perl e lancia lesecuzione del comando unix specificato. Listruzione qx è sicuramente la più utile poiché restituisce sotto forma di stringa lo standard output prodotto dallesecuzione del comando unix. La stringa tipicamente sarà assegnata ad unaltra variabile.
BIOINFO3 - Lezione 3311 ESEMPIO
BIOINFO3 - Lezione 3312 ESEMPIO 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 Programma che restituisce i codici genbank delle est contenute nel file passato come argomento
BIOINFO3 - Lezione 3313 ESEMPIO
BIOINFO3 - Lezione 3314 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 3315 ESERCIZIO
BIOINFO3 - Lezione 3316 RIEPILOGO Definizione e chiamata di subroutine in Perl Funzioni Chiamata di programmi esterni in Perl