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.