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
Scarica

bioinfo3