Espressioni regolari

Le espressioni regolari (regular expressions or regexp) sono uno strumento comune alla maggior parte dei linguaggi di programmazione. In Perl l'utilizzo delle espressioni regolari è particolarmente semplice e intuitivo. Per indicare un'espressione regolare non servono né funzioni specifiche, né un oggetto (come in molti linguaggi OOP), ma è sufficiente racchiudere il pattern dell'espressione regolare tra due caratteri "/" (slash). Ad esempio:

my $var = "Ciao Mondo!" ;
print 'La variabile $var contiene il testo \'Ciao\'' if ($var =~ /Ciao/) ;

esegue il controllo (utilizzando l'operatore =~) che confronta il contenuto della variabile $var con la stringa "Ciao". Il risultato in questo caso è true, perché la stringa "Ciao" è effettivamente contenuta nella variabile $var.

Come al solito è possibile dare per sottinteso l'uso della variabile _$, come qui sotto

$_ = "Hello World!" ;
print 'La variabile $_ contiene il testo \'Hello\'' if (/Hello/) ;

Se invece vogliamo usare le espressioni regolari per modificare una variabile possiamo usare la sintassi:

$var =~ s/old/new/ ;
# Versione con variabile implicita: s/old/new/ ;

che rimpiazza il testo "old" con il testo "new". Per sostituire tutte le occorrenze del valore "old" col valore "new" si appende il flag "g" in fondo all'espressione regolare.

$var =~ s/old/new/g ;

Vediamo un esempio: consideriamo il testo "Nel blu dipinto di blu" e supponiamo di voler sostituire la stringa "blu" con la stringa "rosso". Se scriviamo

my $var = "Nel blu dipinto di blu" ;
print "Prima della sostituzione: $var\n" ;
$var =~ s/blu/rosso/g ;
print "Dopo la sostituzione: $var\n" ;

Si ottiene come risultato:

Prima della sostituzione: Nel blu dipinto di blu
Dopo la sostituzione: Nel rosso dipinto di rosso

Approfondimenti

Le espressioni regolari sono uno strumento molto potente, soprattutto quando lavoriamo in Perl. Chi non è abituato a lavorare con le espressioni regolari rischia di farsi scoraggiare dalla sintassi e/o dalla lunga lista di simboli, notazioni, flag eccetera. Il nostro consiglio è quello di non imparare il significato di tutti i simboli utilizzati dalle espressioni regolari (a meno che esse non siano il nostro pane quotidiano). Conviene piuttosto consultare la grammatica delle espressioni regolari all'occorrenza. In molti casi persino una guida essenziale come quella riportata qui potrebbe bastare alle nostre esigenze.

In generale, tutte le volte che sentiamo l'esigenza di controllare o manipolare dei pattern all'interno di un testo, potrebbe essere conveniente ricorrere ad un'espressione regolare. Ricordiamoci che probabilmente qualcuno ha già affrontato (e risolto) il problema per conto nostro. Vediamo un esempio: supponiamo di voler controllare se una certa data è formata rispettando un certo pattern, ad esempio:

DD/MM/YYYY

La soluzione è sicuramente già presente sul Web. In questo caso basta aprire un motore di ricerca e scrivere qualcosa del tipo "date regular expression" per trovare decine di soluzioni già pronte, come ad esempio qui oppure qui.

Avremo così a disposizione diverse opzioni, che possiamo utilizzare nel nostro codice. Una possibile soluzione potrebbe essere la seguente:

my $date_1	= "23/03/2007" ;
my $date_2 	= "23-03-2007" ;
if ($date_1 =~ /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/) {
	print "Prima data: valida" ;
} else {
	print "Prima data: NON valida" ;
}
print "\n" ;
if ($date_2 =~ /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/) {
	print "Seconda data: valida" ;
} else {
	print "Seconda data: NON valida" ;
}
print "\n" ;

che ritorna

Prima data: valida
Seconda data: NON valida


Home Pagina 12 di 15