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/ L’espressione nel suo complesso è vera se il pattern descritto dall’espressione regolare è trovato nella stringa. In tal caso la stringa ($stringa) appartiene a quell’insieme verde che avevamo visto nel primo lucido. Se invece $stringa non contiene il pattern allora si troverà nell’insieme 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 29 1 ESEMPIO BIOINFO3 - Lezione 29 2 ESEMPIO operatore “x”: ripete un numero prefissato di volte la stringa che lo precede Il pattern può essere una variabile!!!! BIOINFO3 - Lezione 29 3 BIOINFO3 - Lezione 29 4 ESERCIZIO Leggere un file (ad esempio in redirezione) . Stampare solo le righe che iniziano con il carattere > BIOINFO3 - Lezione 29 5 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 BIOINFO3 - Lezione 29 ( ) $2 / ….. 6 ESEMPIO Nella seguente istruzione ho colorato i tre sottopattern con colori diversi per individuarli subito a vista d’occhio. 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 l’anno, separate dal carattere -) allora si esegue l’if, 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 29 7 ESERCIZIO Leggere delle righe dall’input. Se la riga inizia con la stringa PESO: seguita da un numero qualsiasi di spazi e tab e da un numero, catturare tale numero. Altrimenti stampare un messaggio di errore. Se il numero è maggiore o uguale a 100 stampare “A DIETA!\n” altrimenti stampare “PESO OK!\n”. BIOINFO3 - Lezione 29 8 SOSTITUZIONI In una stringa è possibile sostituire automaticamente una sottostringa che verifichi un determinato pattern con un’altra stringa $stringa=~ s/pattern di ricerca/sostituzione/gi Le opzioni g ed i sono facoltative e valgono anche per il pattern matching: g sostituisce tutte (global) le occorrenze del pattern incontrate. Se non si specifica g, viene sostituita solo la prima occorrenza. i sostituisce 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 29 9 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; essere anche minuscola!) BIOINFO3 - Lezione 29 (N.B. la sequenza potrebbe 10 ESERCIZIO Leggere delle righe dall’input. 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 29 11 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. BIOINFO3 - Lezione 29 12