BIOINFO3 - Lezione 291 PATTERN MATCHING Imparato cosa sono e come si usano le espressioni regolari per individuare dei pattern, vediamo come si usano in Perl per cercare i pattern in una stringa $stringa=~ /espressione regolare/ Lespressione nel suo complesso è vera se il pattern descritto dallespressione regolare è trovato nella stringa. In tal caso la stringa ($stringa) appartiene a quellinsieme verde che avevamo visto nel primo lucido. Se invece $stringa non contiene il pattern allora si troverà nellinsieme di stringhe rosso. Esiste anche una versione con !~ al posto di =~ che funziona al contrario: è vera se la stringa non contiene il pattern $a=~ /Mari[ao]/ è vera se la stringa $a contiene il pattern Maria o Mario if ($a=~/^\d+$/){vera se $a è un numero naturale print $a è un numero\n; }
BIOINFO3 - Lezione 292 ESEMPIO
3 ESEMPIO operatore x: ripete un numero prefissato di volte la stringa che lo precede Il pattern può essere una variabile!!!!
BIOINFO3 - Lezione 294
5 ESERCIZIO Leggere un file (ad esempio in redirezione). Stampare solo le righe che iniziano con il carattere >
BIOINFO3 - Lezione 296 ESTRAZIONE DEI PATTERN Se si è interessati a ricavare il valore effettivo delle sottostringhe che hanno soddisfatto certi pattern (ad esempio anche solo una parte di una espressione regolare) si possono racchiudere questi pattern tra parentesi tonde. Le sottostringhe vengono poi automaticamente assegnate rispettivamente alle variabili $1, $2, … (il primo pattern tra parentesi alla variabile $1, il secondo alla variabile $2,…) / ( ) ( ) / $1 $2 …..
BIOINFO3 - Lezione 297 ESEMPIO Nella seguente istruzione ho colorato i tre sottopattern con colori diversi per individuarli subito a vista docchio. In particolare se la stringa $data ha il formato previsto ed è quindi una data valida (una o due cifre per il giorno, una o due cifre per il mese, due, tre o quattro cifre per lanno, separate dal carattere -) allora si esegue lif, in cui la sottostringa corrispondente al primo pattern viene salvata in $1, la sottostringa corrispondente al secondo pattern viene salvata in $2 e la sottostringa corrispondente al terzo pattern viene salvata in $3 if ($data=~ /(^[0-9]?[0-9])-([0-9]?[0-9])-([0-9]?[0-9]?[0-9][0-9]$)/){ $giorno=$1; $mese=$2; $anno=$3; }
BIOINFO3 - Lezione 298
9 SOSTITUZIONI In una stringa è possibile sostituire automaticamente una sottostringa che verifichi un determinato pattern con unaltra stringa $stringa=~ s/pattern di ricerca/sostituzione/gi Le opzioni g ed i sono facoltative e valgono anche per il pattern matching: gsostituisce tutte (global) le occorrenze del pattern incontrate. Se non si specifica g, viene sostituita solo la prima occorrenza. isostituisce in modo case insensitive, cioè non preoccupandosi se la stringa trovata ha esattamente le maiuscole e le minuscole specificate $a=AUTOCARRO 150; $a=~ s/AUTO/MOTO/; # $a diventa MOTOCARRO 150 $a=~ s/RR/R/g; # $a diventa MOTOCARO 150 $a=~ s/ //g; # $a diventa MOTOCARO150 $a=~ s/[0-9]+//g; # $a diventa MOTOCARO
BIOINFO3 - Lezione 2910 ESERCIZI Rimuovere dalla stringa $b tutte le occorrenze dei caratteri di spaziatura Sb=~ s/\s//g; (N.B. senza il g rimuove solo il primo!!) Trasformare tutti gli spazi multipli della stringa $nome in spazi singoli Snome=~ s/ +/ /g; (N.B. ancora è necessario il g) Rimuovere dalla stringa $cognome gli spazi iniziali Scognome=~ s/^ +//; Mascherare nella sequenza di DNA $s la sottosequenza ACTGTT con XXXXXX Ss=~ s/ACTGTT/XXXXXX/gi; (N.B. la sequenza potrebbe essere anche minuscola!)
BIOINFO3 - Lezione 2911 ESERCIZIO Leggere delle righe dallinput. Le righe rappresentano sequenze di DNA. Se la riga contengono il > stampare la riga cosi comè. Altrimenti stampare la riga dopo aver rimosso tutti i caratteri diversi dalle quattro basi
BIOINFO3 - Lezione 2912 RIEPILOGO Pattern matching Estrazione di pattern Sostituzione di pattern Esercizio 15. Passare come argomenti ad un programma due nomi di file. Il primo contiene delle stringhe (una per riga), il secondo delle espressioni regolari (uno per riga). Stampare una per riga le stringhe e per ciascuna stampare, sulla stessa riga, separati da spazi, tutte e sole le espressioni regolari verificate da quella stringa.