Perl es uno de los lenguajes más poderosos para trabajar con expresiones regulares. Se utilizan los operadores =~ y !~ para hacer coincidencias.
Modificadores de expresiones regulares:
i — ignora mayúsculas y minúsculasg — búsqueda global (todos los segmentos encontrados)m — modo multlínea (funciona ^ y $ en cada línea)s — el punto (.) incluye el carácter de nueva líneaEjemplo:
my $text = "Mi correo electrónico: max@mail.com y ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Correo electrónico: $1 "; }
En este ejemplo, el bucle extrae todos los correos electrónicos de la cadena.
Después de una coincidencia, los valores se capturan en variables especiales $1, $2, ... (por cada grupo de captura).
¿Qué se almacenará en la variable $1 después de una búsqueda fallida con una expresión regular?
Respuesta:
$1no se actualiza en caso de una coincidencia no exitosa — mantiene el valor de la última coincidencia exitosa. ¡Esto puede ser una fuente de errores! Para evitarlo, en condiciones complejas es mejor limpiar explícitamente$1,$2, ...
Historia
La validación de datos de entrada con una expresión regular compleja dependía del valor de
$1. Después de una coincidencia que no encontró una cadena adecuada, la variable$1no cambió, y el procesamiento continuó con la antigua dirección de correo electrónico incorrecta.
Historia
El programador se equivocó con el modificador. En un texto grande aplicaron
/abc/g, esperando el modo multlínea. Como resultado, el patrón no encontraba las líneas necesarias con saltos de línea, aunque deberían haber usado/abc/ms.
Historia
En el proyecto se olvidaron de utilizar la bandera global
/gal buscar todas las coincidencias. Consecuencia: el script solo extraía la primera coincidencia, mientras que el usuario esperaba una lista completa de datos.