Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014

454 views

Published on

Introduction to Perl programming, practical lesson held at BMR Genomics for the "Introduction to Bioinformatics Programming".

Published in: Science
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
454
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014

  1. 1. Tutto Perl in 2 ore The CRIBI Crash Course Andrea Telatin e Giovanni Birolo Bioinformatics Unit, CRIBI
  2. 2. from: http://www.zoitz.com/archives/13
  3. 3. Homeworks fatti?
  4. 4. Cosa voglio fare? • Dato un allineamento in formato SAM (INPUT)! • Calcolare quante read sono allineate in ciascun cromosoma (TASK) • E stampare una “tabella” con tre colonne:
 cromosoma, numero di allineamenti, percentuale 
 (OUTPUT)
  5. 5. Tipi di dati • Variabili scalari (testo o numeri) come $nome • contengono 1 nome o numero $nome = ‘pino’; • Array di scalari (…) come @array • elenco di scalari @nome = (‘lino’, ‘giovanni’, $nome); • Array associativi, od hash %hash • chiave e valore come %eta = (‘lino’ => 21, ‘momi’ => 2);
  6. 6. Array • Sono liste di scalari • Creazione di un array vuoto:
 @appello = (); • Inizializzazione di un array:
 @appello = (‘Giov’, ‘Andre’, ‘Nick’, ‘Risso’, ‘Chuck’);
 @prova = (‘Mio’, ‘Tuo’, 21, 22.2, ‘Tombola’);
  7. 7. Array e indici • dato l’array:
 @array = (‘Uno’, ‘due’, ‘tre’, $jolly, $altro); • ogni elemento ha un indice numerico da 0 a n. • l’ultimo indice è $#array. Quanti elementi in tutto? • $terzo = $array[2];
 print “Il terzo elemento è $terzo (= $array[2])n”;
 print “L’ultimo elemento ha indice $#array,
 ed è $array[-1]n”;
  8. 8. Funzioni per array • aggiungi una variabile: push
 push(@array, ‘Nuovo elemento’);
 push(@array, ‘Uno’, ‘due’, ‘tre’, $jolly, $altro); • estrai la prima variabile (e toglila): shift
 $primo = shift(@array);
 shift(@array); • estrai l’ultima variabile (e toglila): pop
 $ultima = pop(@array);
  9. 9. Funzioni per array • in sintesi…
  10. 10. Hash (o array associativi) • Sono liste non ordinate di coppie di valori, il primo si chiama “chiave” (deve essere univoco), l’altro “valore” • Creazione di un hash vuoto:
 %hash = ();" • Inizializzazione di un hash:
 %nomi = (‘geno-1’ => ‘Momi’, ‘geno-2’ => ‘Carlo’,
 ‘geno-33’ => ‘Dietelmo’);
  11. 11. Hash (o array associativi) • Dato l’hash
 %nomi = (‘geno-1’ => ‘Momi’, ‘geno-2’ => ‘Carlo’,
 ‘geno-33’ => ‘Dietelmo’);" • Per avere il valore data la chiave:
 print “Il nome di ”geno-1” è $nomi{‘geno-1’}”;
  12. 12. Hash (o array associativi) • Dato l’hash
 %nomi = (‘geno-1’ => ‘Momi’, ‘geno-2’ => ‘Carlo’,
 ‘geno-33’ => ‘Dietelmo’);" • Per avere il valore data la chiave:
 foreach $chiave (keys %nomi) {
 $c++;
 print “Login:$chiavetNome:$nomi{$chiave}n”;
 }
 print “Ho trovato $c login nell’hashn”;
  13. 13. Blocco di codice • Un set di istruzioni da essere eseguite si chiama blocco, ed in Perl è un listato racchiuso da graffe.! ! • {
 blocco
 di 
 comandi… ogni comando deve finire
 con un “;”
 }
  14. 14. Numeric operators OPERATIONS! • $num = $i + $c; • $num = $i - $c; • $num = $i / $c; • $num = $i % $c; • $num = $i ** $c; SHORTCUT FOR SELF! • $num += $c;* • $num -= $c; • $num /= $c; • $num %= $c; equal to $num = $num + $c;*
  15. 15. Numeric operators INCREMENTING/DECREMENTING:! $number = $number + 1 is a very common operation. The general shortcut is $number += 1; We can go further: $number++; Same for $number--;
  16. 16. String operators OPERATIONS! • Concatenation:
 $t = $f . $p; • Multiply:
 $num = $i x $c; * again you can shortcut:
 $string .= $add is equal to $string = $string.$add; Example! $f = ‘ciao’;
 $p = ‘!’; 
 $p1 = $p x 5; # result=!!!!!
 $t = $f . $p1; # result= ciao!!!
  17. 17. Comparison operators NUMERIC! • 2 == 2 • 2 != 4 • 2 < 3 • 3 > 1 • 4 >= 2 STRINGS! • ‘me’ eq ‘me’ • ‘me’ ne ‘you’ • other are less used Remember that the =! is used to assign a value.! NEVER for comparison
  18. 18. Verificare condizioni
  19. 19. If … • Eseguo un blocco di codice se si verifica una condizione if ($nome eq ‘Giovanni’) { # eseguo tutto quello che è fra { e } print “CIAO!n”; } else { # eseguo tutto quest’altro blocco print “E allora, chi sei?n”; } 1 2 3 4 5 6 7 8 9 10
  20. 20. If … • Eseguo un blocco di codice se si verifica una condizione if ($nome eq ‘Giovanni’) { # eseguo tutto quello che è fra { e } print “CIAO!n”; } else { # eseguo tutto quest’altro blocco print “E allora, chi sei?n”; } 1 2 3 4 5 6 7 8 9 10 Condizione che deve essere VERA
  21. 21. If … • Eseguo un blocco di codice se si verifica una condizione if ($nome eq ‘Giovanni’) { # eseguo tutto quello che è fra { e } print “CIAO!n”; } else { # eseguo tutto quest’altro blocco print “E allora, chi sei?n”; } 1 2 3 4 5 6 7 8 9 10 Blocco di codice eseguito SE la condizione è verificata
  22. 22. If … • Eseguo un blocco di codice se si verifica una condizione if ($nome eq ‘Giovanni’) { # eseguo tutto quello che è fra { e } print “CIAO!n”; } else { # eseguo tutto quest’altro blocco print “E allora, chi sei?n”; } 1 2 3 4 5 6 7 8 9 10 Blocco di codice eseguito SE la condizione è verificata La condizione deve poter essere “vera” o “falsa” Esempi: La riga corrente è di intestazione FASTA? —> Ovvero il primo carattere è un “>” ! !
  23. 23. Cicli Ovvero come reiterare un {blocco} di operazioni
  24. 24. In generale • Un ciclo ripete un blocco di operazioni un certo numero di volte • Generalmente ho una variabile “temporanea” da usare per tener traccia di quante iterazioni ho fatto
  25. 25. While … • Eseguo un blocco di codice fin tanto che una condizione è vera (ovvero finché non diventa falsa) while (piove) { print “Sono stanco della pioggia…n”; } print “ FINALMENTE IL SOLEEEEEn”; 1 2 3 4 5 6 7 8 9 10
  26. 26. While … • Eseguo un blocco di codice fin tanto che una condizione è vera (ovvero finché non diventa falsa) while ($risultato < 1000) { $risultato = $risultato**2; print “Siamo arrivati a $risultaton”; } print “ FINE: $risultato >= 1000n”; 1 2 3 4 5 6 7 8 9 10
  27. 27. While … • Eseguo un blocco di codice fin tanto che una condizione è vera (ovvero finché non diventa falsa) while ($risultato < 1000) { $risultato = $risultato**2; print “Siamo arrivati a $risultaton”; } print “ FINE: $risultato >= 1000n”; 1 2 3 4 5 6 7 8 9 10 Condizione: entro nel ciclo WHILE solo se è VERA (altrimenti lo salto)
  28. 28. While … • Eseguo un blocco di codice fin tanto che una condizione è vera (ovvero finché non diventa falsa) while ($risultato < 1000) { $risultato = $risultato**2; print “Siamo arrivati a $risultaton”; } print “ FINE: $risultato >= 1000n”; 1 2 3 4 5 6 7 8 9 10 Questo blocco di codice viene eseguito FINO A CHE la condizione è vera. Attenzione: anche all’infinito se non cambia qualcosa durante l’esecuzione
  29. 29. While … • Eseguo un blocco di codice fin tanto che una condizione è vera (ovvero finché non diventa falsa) while (il file non è finito) { $riga = leggi_una_riga(); $contaRighe++; } print “ Il file ha $contaRighe righen”; 1 2 3 4 5 6 7 8 9 10 L’uso tipico che faremo è leggere un file riga per riga. La condizione che verifichiamo è che non sia l’ultima riga. Non sappiamo a priori quante righe sono, ma sappiamo che dopo l’ultima dobbiamo uscire :)
  30. 30. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10
  31. 31. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10 Inizializzo il contatore
  32. 32. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10 Eseguo fintanto che questa condizione è VERA
  33. 33. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10 Eseguo questa operazione AD OGNI CICLO (ovvero incremento il contatore)
  34. 34. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10 Eseguo questa operazione AD OGNI CICLO (ovvero incremento il contatore)
  35. 35. For … • Eseguo un blocco di codice un certo numero di volte, usando una variabile “contatore” for ($i=10; $i<20; $i++) { # eseguo tutto quello che è fra { e } print “Ciao, $i volta su 20!n”; } 1 2 3 4 5 6 7 8 9 10
  36. 36. Ultimo ciclo: foreach • ripeti un blocco di codice per ciascun elemento di un array! • Proviamo senza:
 
 @lista = (‘ciao’, ‘mondo’, ‘crudele’);
 for ($i=0; $i<=$#lista; $i++) {
 $elemento = $lista[$i];
 print “ -> $elementon”;
 }
  37. 37. Ultimo ciclo: foreach • ripeti un blocco di codice per ciascun elemento di un array! • Proviamo con:
 
 @lista = (‘ciao’, ‘mondo’, ‘crudele’);
 foreach $elemento (@lista) {
 print “ - $elementon”;
 }" • In italiano vuol dire scorri l’array e ad ogni ciclo metti l’elemento corrente dentro una comoda variabile.
  38. 38. Un po’ di funzioni
  39. 39. Lessico • Una funzione puo’ richiedere o meno dei parametri, si chiamano argomenti! • Se una funzione emette un risultato, si dice che “restituisce”, o ritorna, un valore. • Una funzione può restituire scalari, array o altro… valore = funzione(argomenti)
  40. 40. una prima funzione: int • la funzione int() rimuove i decimali di un numero, che li abbia o meno • int($numero) restituisce il numero troncato, ma non altera il suo argomento • $intero = int(9/8);
 $intero = int($fraction); print “Ciao!n”;
 $stud = 29;
 $bisc = 291;" 
 # si aggiunge uno
 # studente!
 $stud++;" $bps = $bisc/$stud;" $tondi = int($bps);" print “Ogni studente avrà $tondi biscottin”;"
  41. 41. un’altra funzione: sqrt • la funzione sqrt() ritorna la radice quadrata dell’argomento. • sqrt($numero) restituisce un numero, potenzialmente con la virgola • $radice = sqrt(9/8);
 $root = sqrt($valore*2); print “Lato quadraton”;
 
 $area = 1000; 
 $lato = sqrt($area);" ! print “ Area: $area cm2
 Lato: $lato cmn”;
  42. 42. casualità: rand • la funzione rand() ritorna un numero casuale. • rand() ritorna da 0 a 1. • Se specifico un argomento: rand(10) da 0 a 9.99. • $num = rand();
 $num = int(rand(91)); # Programma lancia dadi! print “Lancio n dadin”;" ! $num_dadi = 20;" for ($i=1; $i<=$num_dadi; $i++) {" $valore = int(rand(6))+1;" print “Dado n. $i: $valoren”;" }" ! print “Ho finito.n”;
  43. 43. ancora su print • print stampa una stringa da qualche parte :) • print DOVE “Stringa da stampare”. • Dove è un “filehandle” che avete creato voi, o uno standard come STDOUT o STDERR. • print “Questo va in output”; # sottinteso STDOUT
 print STDERR “Attenzione!n”; # Importante per messaggi
 print O “Stampa sul file…”; #vedi oltre
  44. 44. ancora su print • Abituatevi fin da subito a usare
 print STDERR “Messaggion”;
 per i messaggi informativi! • E usare 
 print “Valori e risultati…n”;
 per l’output vero e proprio del programma
  45. 45. funzioni per stringhe • uc($stringa) converte una stringa in maiuscolo • lc($stringa), in minuscolo • length($stringa) riporta la lunghezza in caratteri • $NOME = uc($nome);
 $size = length($dna); print “Ciao!n”;
 $stud = 29;
 $bisc = 291;" 
 # si aggiunge uno
 # studente!
 $stud++;" $bps = $bisc/$stud;" print “Ogni studente avrà $bps biscottin”;" $tondo = int($bps);" print “Intero = $tondon”;"
  46. 46. Togliere n da stringhe • la funzione chop() toglie (e restituisce) l’ultimo carattere di una stringa:
 $last = chop($string);" • la funzione chomp() toglie l’ultimo carattere solo se è un a capo.
 chomp($riga); print “Ciao!n”;
 $stud = 29;
 $bisc = 291;" 
 # si aggiunge uno
 # studente!
 $stud++;" $bps = $bisc/$stud;" print “Ogni studente avrà $bps biscottin”;" $tondo = int($bps);" print “Intero = $tondon”;"
  47. 47. Holy grail: substr • “substring”: a function to retrieve a slice of a string • $stringa = ‘pipi e pupu’;
 $slice = substr($stringa, 3, 6); # conterrà “i e pu” • Tutte le funzioni accettano variabili come argomenti:
 $slice = substr($stringa, $from, $span);" • Può fare cose più complicate! —> Leggi il manuale

  48. 48. Un primo esempio $sequenza = ‘ACGATCGTACGTAGCTGACTGATCGTACGTAACGTACGTAGCT GACTGATCGATCGTAGCTAGCAGCTGATCGACTGACTGACTGAT CGATCGTACGTAGCTAGCTGACTGATC’;" $lunghezza = length($sequenza);
 $lunghezza_read = 12;
 $posizione = int(rand($lunghezza - $lunghezza_read);
 $seq = substr($sequenza, $posizione, $lunghezza_read);
 print “>Randomn$seqn”;
  49. 49. dividere stringe: split • split spezza una stringa ogni volta che trova un pattern (il pattern viene rimosso). • I pezzi possono essere tanti quindi restituisce un array! • $stringa = ‘Giovanni Giuseppe Lanfranchi’;
 @campi = split(“ ”, $stringa);
 @prova = split(“Gi”, $stringa);
 print “ $campi[0], $campi[2]n$prova[0] -> $prova[1]n”;
  50. 50. dividere stringe: split • Un file SAM è un file tabulato (ogni campo è separato da “tab”, che ha come simbolo t • @campi = split(“t”, $riga_sam);
 $num_campi = $#campi + 1;
 print “Nome sequenza: $campi[0], 
 cromosoma: $campi[2]n”;

  51. 51. unire stringhe: join • al contrario di split che prende una stringa e la spezza (creando un array), join prende un array e lo unisce in una stringa • Il pattern in questo caso funge da “separatore”. • $nuova_riga_sam = join(@pezzi, “t”);
 @nomi = (‘Pino’, ‘Macino’, ‘Momi’);
 $elenco = join(@nomi, “; ”);

  52. 52. mettere in ordine: sort • restituisce un array ordinato alfabeticamente, non modifica l’originale @sorted = sort(@appello);" • con dei trucchi si ordina secondo altri criteri, ad esempio: @numeri = sort {$a <=> $b} (@lista_numeri);
  53. 53. hash e i suoi array: keys • un hash è un doppio array, un array “chiavi” in relazione con un array “valori”.
 @chiavi = keys(%hash);
 @valori = values(%hash); • In questo modo possiamo usare le funzioni già note per gli array, ad esempio il ciclo foreach diventa:
 
 foreach $key (keys %hash) {
 …
 }
  54. 54. Un array speciale @ARGV • @ARGV contiene tutti i parametri passati dalla riga di comando (shell) • esempio: 
 $ perl tuoprogr.pl ciao caro! (comando)
 
 print “$ARGV[0] $ARGV[1]n”; (tuoprog.pl)
  55. 55. Un array speciale @ARGV • @ARGV contiene tutti i parametri passati dalla riga di comando (shell) • esempio: 
 $ perl tuoprogr.pl ciao caro! (comando)
 
 foreach $parametro (@ARGV) {
 $c++;
 print “Parametro n. $c: ”$parametro””;
 }
 if ($c>1) { $suff = ‘i’; } else { $suff = ‘o’; }
 print “L’utente ha mandato $c parametr$suff …n”;

  56. 56. Leggere un file • Consideriamo di avere un file chiamato “lista.txt” nella directory /home/geno/files/. • Aprire un file significa permettere a Perl di leggerlo una riga alla volta. • Comando per aprire un file: • open(F, “nomefile”);" • é una funzione, restituisce (ritorna) come valore VERO (tutto OK) o FALSO (non riesco ad aprire il file)
  57. 57. “Aprire” un file • Come si usa il comando open? È una funzione che restituisce vero se riesce o falso se non.
 
 if (open(I, “filename”)) {
 print “Ho aperto il file.n”;
 } else {
 die “ Non riesco ad aprire il file filename.n”;
 } • Tipicamente useremo una variabile che contiene il nome del file, tipo open(I, “$filename”) • Come si legge il file poi?
  58. 58. Leggere un file • if (open(SAM, “filename”) == 0) {
 die “ Non riesco ad aprire il file filename.n”;
 } • Come si legge il file poi? Perl ce lo fa leggere riga per riga, con un ciclo while
 while ($riga = <SAM>) {
 print “$riga”;
 }" • Attenzione: $riga contiene sempre l’a-capo alla fine! Se non serve usare chomp($riga)!
  59. 59. Leggere un file: cat.pl • if (open(I, “$filename”) == 0) {
 die “ Non riesco ad aprire il file “$filename”.n”;
 }
 
 while ($riga = <I>) {
 chomp($riga);
 $c++;
 print “$rigan”;
 }
 print STDERR “Ho finito di leggere il file: ha $c righe totali. n”;
  60. 60. Leggere un file: cat.pl • $filename = $ARGV[0];
 if ($filename eq ‘’) {
 die “ ERROR: Questo programma richiede il nome di un file!n”;
 }
 
 if (open(I, “$filename”) == 0) {
 die “ Non riesco ad aprire il file “$filename”.n”;
 }
 
 while ($riga = <I>) {
 chomp($riga);
 $c++;
 print “$rigan”;
 }
 print STDERR “Ho finito di leggere il file: ha $c righe totali.n”;
  61. 61. Traslitterare una stringa • $s = ‘sono una simpatica stringa’;" • Per verificare se una variabile contiene un pattern:
 $s =~tr/da/a/; " • Esempi:
 $s =~tr/i/X/; # adesso s = sono una sXmpatXca strXnga
 
 $seq = ‘ACACGTAGCTGACT’;
 $seq = reverse($seq);
 $seq =~tr/ACGT/tgca/;
  62. 62. Cercare un pattern • $s = ‘sono una simpatica stringa’;" • Per verificare se una variabile contiene un pattern:
 $s =~/pattern/ " • Esempi:
 if ($s =~/simpatica/) {
 print “ Stringa simpatica”;
 }

  63. 63. Rendere gli script eseguibili • Per lanciare uno script invochiamo l’interprete “perl”, del tipo perl /home/dir/file.pl • Possiamo rendere lo script “eseguibile” dalla shell e invocabile semplicemente come /home/dir/file.pl" • Dobbiamo aggiungere come prima riga dello script:
 #!/usr/bin/env perl • E poi dalla shell dare questo comando una sola volta:
 chmod +x /home/dir/file.pl
  64. 64. live demo

×