[PERL] Aporte y consulta xD

Iniciado por [u]nsigned, 25 Julio 2010, 23:55 PM

0 Miembros y 1 Visitante están viendo este tema.

[u]nsigned

Código (perl) [Seleccionar]
#!/usr/bin/perl
# Scrip en PERL que lista todos los mails encontrados en un ficheo plano de texto
# Esta limitado a listar solo los mails con formato user@host.xxx
#
#Declaracion de funcion inicializadora, compurbo que seespecificaron bien loas argumento o muestro la ayuda llamando a 'show_help()'
sub init(){
if(($#ARGV+1)!=1){&show_help}
else{
if($ARGV[0] eq '--help'){&show_help}
else{
$fichero=$ARGV[0];
#LLamo a la funcion que lee y porcesa la informacion
&extraer_mails;
}
}

}
#Declaracion de funcion que informa uso
sub show_help(){
print "lsmails.pl\nVersion 0.1 bajo Licencia GPL\n\n";
print "Modo de empleo: lsmails --help | FICHERO\n";
print "Devuelve todos los mails en FICHERO con formato user\@host.xxx\n\nOPCIONES:\n";
print "\t--help:\t\tmuestra la ayudadel script.\n";
print "\tFICHERO:\tdebe ser un archivo plano de texto\n\n";
print "Ejemplo de uso:\tlsmails miarchivo.txt\n\n";
print "Autor: [u]nsigned - facku.mail\@gmail.com\n";
exit;
}
#Declaracion de funcion que lee y procesa el archivo de entrada
sub extraer_mails(){
#Abro elarchivo
open(AR,$fichero)||die"$!\n";
while(<AR>){
@palabras=split(" ",$_);
foreach $palabra(@palabras){
if($palabra=~/\w+@\w+\.\w*[^\.]$/){
print "$palabra\n";
}
}
}
}

&init;


Este script es simple, busca todas las direcciones de emial en un archivo pasado como parametro.

Mi duda es que con laexpresion regular solo eh conseguido que detecte los emails con formato user@host.xxx  y no eh conseguido que tambien me devuelva los mails con formato user@host.xxx.yy

Como deberia quedar la expresion regular?

Saludos.

PD: Soy novato en PERL&expresiones regulares, y se me ocurrio hacer este script para practicar lo que estoyaprendiendo  ;D

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

Novlucker

Las expresiones regulares pueden variar bastante dependiendo del texto que se le este pasando como parámetro, y si googleas seguro encuentras muchas formas de hacerlo, pero como veo que lo que revisas son palabras separadas por espacios, esta sería otra forma :P

Código (perl) [Seleccionar]
$text = "mail1\@mail.com palabra6 palabra9 palabra2 palabra11 mail3\@mail.com.uy palabra1 mail2\@mail.com palabra4 palabra5 palabra7 palabra3 palabra8 mial4\@mail.com.ar palabra10";
@p = split(" ",$text);
foreach $palabra(@p)
{
if($palabra=~/\w+@\w+\.\w+/)
{
print "$palabra\n";
}
}


mail1@mail.com
mail3@mail.com.uy
mail2@mail.com
mial4@mail.com.ar


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

~ Yoya ~

#2
Cita de: Novlucker en 26 Julio 2010, 13:33 PM
Las expresiones regulares pueden variar bastante dependiendo del texto que se le este pasando como parámetro
Muy cierto xD.

Código (perl) [Seleccionar]
#!/usr/bin/perl

$text = 'mAil-1@mail.com palabra6 palabra9 palabra2 palabra11 mail3@mail.com.uy palabra1 ma_il2@mail.com palabra4 palabra5 palabra7 palabra3 palabra8 mial4@mail.com.ar';
while($text =~ m/([\w\-]*?@\w+\.\w+\.?\w+)\s?/g){
print $1, "\n";
}
exit;


Salida:
yoya@yoya-desktop:~/Escritorio$ perl e.pl
mAil-1@mail.com
mail3@mail.com.uy
ma_il2@mail.com
mial4@mail.com.ar


Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.