Perl è uno dei linguaggi più potenti per lavorare con le espressioni regolari. Per le corrispondenze si utilizzano gli operatori =~ e !~.
Modificatori delle espressioni regolari:
i — insensibile al casog — ricerca globale (tutte le occorrenze)m — modalità multilinea (funziona ^ e $ su ogni riga)s — il punto (.) include il carattere di nuova lineaEsempio:
my $text = "La mia email: max@mail.com e ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
In questo esempio, il ciclo estrae tutte le email dalla stringa.
Dopo la corrispondenza, i valori vengono catturati in variabili speciali $1, $2, ... (per ogni gruppo di cattura).
Cosa verrà memorizzato nella variabile $1 dopo una ricerca non riuscita con l'espressione regolare?
Risposta:
$1non si aggiorna in caso di corrispondenza non riuscita — conserva il valore dell'ultima corrispondenza riuscita. Questo può essere una fonte di errori! Per evitarlo, in condizioni complesse è meglio azzerare esplicitamente$1,$2, ...
Storia
La validazione dei dati in ingresso con un'espressione regolare complessa dipendeva dal valore di
$1. Dopo una corrispondenza non riuscita, la variabile$1non era cambiata, e il processo è andato avanti con il vecchio indirizzo email errato.
Storia
Un programmatore ha sbagliato modificatore. In un lungo testo è stato applicato
/abc/g, pensando alla modalità multilinea. Di conseguenza, il pattern non trovava le righe necessarie con i ritorni a capo, mentre bisognava usare/abc/ms.
Storia
Nel progetto è stato dimenticato di utilizzare il flag globale
/gdurante la ricerca di tutte le occorrenze. Conseguenza — lo script estraeva solo la prima corrispondenza, mentre l'utente si aspettava un elenco completo di dati.