Pattern Matching

Guida a Perl
di M. Liverani

Con il termine pattern matching si intende l'operazione di verifica se una certa stringa o una sua sottostringa corrisponde ad un certo pattern, ossia se è costruita secondo un determinato schema.

In Perl l'operatore che consente di effettuare il pattern matching è indicato da ``m/espressione regolare/''; in effetti la lettera ``m'' (match) che precede la coppia di slash (``/'') può essere omessa.

Per verificare se la stringa contenuta nella variabile $a (o una sua sottostringa) corrisponde al pattern descritto da una certa espressione regolare si utilizzerà la seguente istruzione, che restituisce naturalmente il valore ``vero'' se il matching riesce e ``falso'' altrimenti:

$a = /espressione regolare/

Supponiamo quindi di voler leggere dal canale di input standard una stringa immessa dall'utente e di voler verificare se la stringa è strutturata in un certo modo (ad esempio un numero, seguito da uno spazio e quindi da una stringa qualsiasi); il programma potrebbe essere il seguente:

#!/usr/local/bin/perl print "Inserisci una stringa: ";
$a = <STDIN>;
if ($a =~ /^\d+\s.+/) {
print "Ok, il formato della stringa e' corretto\n";
} else {
print "Il formato non e' quello desiderato\n";
}

Supponiamo ora di voler stampare tutte le righe di un certo file che contengono una stringa inserita dall'utente. Un possibile programma per la soluzione di questo semplice problema è il seguente:

#!/usr/local/bin/perl
print "Nome del file: ";
$file = <STDIN>;
chop($file);
-e $file || die "Il file non esiste!\n\n";
-T $file || die "Il file non e' un file di testo!\n\n";
print "Stringa da cercare: ";
$stringa = <STDIN>;
chop($stringa);
open (IN, "< $file") || die "impossibile aprire $file.\n\n";
while ($r = <IN>) {
$r =~ /$stringa/ && print $r;
}
close(IN);

Nell'effettuare il matching di una espressione è possibile tenere memoria di alcune componenti dell'espressione stessa. In un'espressione regolare, ogni termine racchiuso tra parentesi tonde verrà memorizzato e ci si potrà riferire ad esso all'interno della stessa espressione mediante la sequenza ``\n'', dove n è il numero progressivo del termine memorizzato.

Ad esempio la seguente espressione regolare ``descrive'' tutte le stringhe del tipo "x = x":

/^(.+)=\1$/

Infatti l'espressione indica che la stringa deve iniziare ("^") con una certa stringa non nulla ("(.+)") che viene memorizzata in "\1", quindi deve essere presente il simbolo di uguaglianza ("="), e deve terminare ("$") con una stringa identica alla precedente ("\1").

Nelle istruzioni successive ad un pattern matching ci si potrà riferire alle variabili "\n" mediante le variabili "speciali" $n.

© Risorse.net (www.risorse.net)
pagina in versione stampabile:
http://www.risorse.net /perl/patternmat.asp?print=ok