Tutto Perl in 2 ore
The CRIBI Crash Course
Andrea Telatin e Giovanni Birolo
Bioinformatics Unit, CRIBI
from: http://www.zoitz.com/archives/13
Homeworks
fatti?
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)
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);
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’);
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”;
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);
Funzioni per array
• in sintesi…
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’);
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’}”;
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”;
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 “;”

}
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;*
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--;
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!!!
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
Verificare condizioni
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
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
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
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 “>”
!
!
Cicli
Ovvero come reiterare un {blocco} di operazioni
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
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
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
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)
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
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 :)
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
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
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
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)
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)
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
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”;

}
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.
Un po’ di funzioni
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)
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”;"
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”;
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”;
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
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
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”;"
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”;"
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

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”;
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”;
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”;

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, “; ”);

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);
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) {

…

}
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)
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”;

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)
“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?
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)!
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”;
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”;
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/;
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”;

}

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
live demo

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

  • 1.
    Tutto Perl in2 ore The CRIBI Crash Course Andrea Telatin e Giovanni Birolo Bioinformatics Unit, CRIBI
  • 2.
  • 3.
  • 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.
    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.
    Array • Sono listedi 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.
    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.
    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.
  • 10.
    Hash (o arrayassociativi) • 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.
    Hash (o arrayassociativi) • 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.
    Hash (o arrayassociativi) • 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.
    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.
    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.
    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.
    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.
    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.
  • 19.
    If … • Eseguoun 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.
    If … • Eseguoun 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.
    If … • Eseguoun 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.
    If … • Eseguoun 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.
    Cicli Ovvero come reiterareun {blocco} di operazioni
  • 24.
    In generale • Unciclo 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.
    While … • Eseguoun 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.
    While … • Eseguoun 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.
    While … • Eseguoun 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.
    While … • Eseguoun 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.
    While … • Eseguoun 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.
    For … • Eseguoun 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.
    For … • Eseguoun 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.
    For … • Eseguoun 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.
    For … • Eseguoun 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.
    For … • Eseguoun 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.
    For … • Eseguoun 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.
    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.
    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.
    Un po’ difunzioni
  • 39.
    Lessico • Una funzionepuo’ 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.
    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.
    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.
    casualità: rand • lafunzione 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.
    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.
    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.
    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.
    Togliere n dastringhe • 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.
    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.
    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.
    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.
    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.
    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.
    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.
    hash e isuoi 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.
    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.
    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.
    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.
    “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.
    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.
    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.
    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.
    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.
    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.
    Rendere gli scripteseguibili • 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.