Bienvenido a Perl en Español, isantander.
La expresión es correcta.
Otra forma de hacerlo:
$From =~ /.+?@.+?@/;La forma ".+" ya sabes que significa "uno o más caracteres", pero cuando le sigue el '?', estamos indicando que se "pare la búsqueda" en cuanto coincida con el siguiente carácter en el patrón. '@' en este caso. Es decir: busca por un conjunto de caracteres hasta justo antes de la primera '@'. Es lo mismo que tenías, pero un poco más eficiente y rápido.
Con ".+?@" ya tenemos la primera arroba. Solo tenemos que volver a ponerlo otra vez, y listo.
No es necesario el modificador "/i" ya que estamos buscando arrobas, no letras que puedan ser minúsculas o mayúsculas.
Otra forma sería:
$From =~ /(?:.+?@){2}/;El modificador "{2}" está indicando que queremos que lo anterior se repita dos veces. Y lo anterior es un patrón encerrado entre paréntesis. Como los paréntesis, normalmente, los usamos para capturar cosas, y no es el caso (solo estamos buscando, no extrayendo información), entonces los paréntesis tienen la forma extendida "(?:...)" que quiere decir que esos paréntesis solo están rodeando el patrón, para facilitar luego la vida al modificador "{2}".
Otra forma sería... contar las arrobas que hay en la dirección de correo:
$arrobas = $From =~ tr/@/@/;Estamos "transliterando" cada arroba con otra (o sea, no estamos haciendo nada), y obtenemos en $arrobas el número de ellas que estén en el $From. Ese número lo deberemos comparar con 1. Por ejemplo:
if ($arrobas > 1) { say "Maligno" }De todas maneras... ten cuidado, porque una dirección de correo no es solo lo que conocemos "alrededor" de las arrobas.
La siguiente expresión es válida como dirección de correo electrónico:
Joaquín Ferrero <"El gran programador"@gmail.com (esta dirección ya no es válida. Usar [email protected])>Sí: todo eso es una dirección de correo. Naturalmente, hay pocas personas con una dirección tan complicada. Pero en mi empresa solemos usar
tags para discriminar los correos:
[email protected]Los correos enviados irán a
[email protected], pero un filtro en el programa cliente permitirá colocar el correo en una bandeja específica. Así no se satura la bandeja de entrada.
También existe la posibilidad de incluir filtros en la propia dirección:
pille#fromdomain#[email protected] : aceptará correos para
[email protected] solo si vienen de example.com
pille#before#[email protected] : aceptará correos para
[email protected] solo si vienen antes del 1 de marzo de 2019.
pero estos casos son muy especiales... Lo más normal es encontrar la dirección normal y corriente, con una '@' y ya está.