Página 1 de 1

Extraer datos de la línea inferior

NotaPublicado: 2006-09-19 12:21 @556
por nrikex
Estoy tratando de automatizar la alta de usuarios de correo con Perl. La idea es que cuando envíen un correo a una cuenta con sus datos automáticamente les devuelva un correo basado en su nombre y apellido, el cual viene en el cuerpo del correo. El problema es el siguiente:

Los correos que me regresan pueden venir de la siguiente forma

Código: Seleccionar todo
-----------

Nombre: nombre-usuario
Apellido: apellido-usuario

Hasta aqui no hay problema, pero hay algunos que me regresan el correo así:

Código: Seleccionar todo
Nombre:
nombre-usuario

Apellido:
apellido-usuario

en estos casos ¿Cómo extraigo la información? y ¿Cómo ignoro las líneas en blanco? en caso de que nombre-usuario este dos o más líneas en blanco de Nombre:

De antemano Gracias

NotaPublicado: 2006-09-19 12:47 @574
por AkonD
Suponiendo que copias el contenido del correo en un array haces un for para leer cada línea puedes hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $var;
my $nombre;
my $apellido;

for (@array) {
  chomp $_;
  next if //;
  if /^Nombre: +(.+)$/ {
     $nombre = $1;
     next;
  }
  if /^Apellido: +(.+)$/ {
    $apellido = $1:
    next;
  }
  if ($_ eq 'Nombre:') {
    $var= 1;
    next;
  }
  if ($_ eq 'Apellido:') {
    $var = 2;
    next;
  }
  $nombre = $_ if ($var == 1);
  $apellido = $_ if ($var == 2);
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Creo que funcionaría. Si no, que los expertos perleros digan algo, jeje.

Aunque yo creo que lo más correcto sería chequear que los usuarios introducen Nombre: nombre y Apellido: apellido y si no es así les mandas un correo diciendo que introdujeron mal el nombre y apellido.

Salu2

NotaPublicado: 2006-09-19 16:35 @733
por explorer
Yo daré la solución con expresiones regulares, claro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$x = 'Nombre:
nombre-usuario

Apellido:
apellido-usuario

'
;

($nombre,$apellido) = $x =~ m/Nombre:\s*(.*)\s+Apellido:\s*(.*)\s+/;

print "$nombre,$apellido.\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usamos '\s' para buscar espacios en blanco, retornos de carro incluidos.
Ponemos '\s*' delante del nombre y apellido porque no sabemos cuantos pueden haber.
Y ponemos '\s+' detrás porque al menos tenemos claro que después de ellos siempre hay un final de línea.
Pero nos da igual... lo que queremos es justo lo que está en el medio :-) que sacamos con la ayuda de los paréntesis de captura.

NotaPublicado: 2006-09-19 18:34 @815
por nrikex
Gracias a ambos, ambas respuestas me fueron muy utiles. ¡¡¡¡ LO MEJOR es la rapidez con que fueron contestadas !!!!

NotaPublicado: 2006-09-20 10:12 @467
por explorer
Hay un problema si hay más campos después del Apellido... el segundo par de paréntesis los capturará todos...
Tendríamos que saber si hay más campos.

NotaPublicado: 2006-09-20 10:54 @496
por AkonD
En mi solución se puede arreglar añadiendo un last al último if

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($var == 2) {
  $apellido = $_;
  last;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


salu2

NotaPublicado: 2006-09-20 11:44 @530
por nrikex
No existen más campos después de los apellidos, aunque sí sucede que se cuelan algunos tags de html. Para evitar que se guarden uso lo siguiente, quizás no sea muy elegante pero me ha servido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$paterno=$2 unless ( m/p\>$/ || m/font/i || m/SPAN/ || m/nbsp/ || m/\=A0\=A0/);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quizás en algún otro caso podría utilizar \w para que tomara únicamente las letras, pero el problema es que cuando recibo el correo algunos usuarios tiene las vocales acentuadas o incluyen la ñ en su nombre o apellido. He podido identificar secuencias como =F31 es la ó, =ED es la í, etc. En todo caso estos caracteres los puedo sustituir con expresiones regulares, pero hay un carácter muy raro que no puedo identificar y por lo tanto no puedo sustituir, y es un símbolo de signo de interrogación que cierra, y digo símbolo porque aparece en mi consola (que la tengo configurada con fondo negro y letras verdes) como un óvalo verde con el signo (?) en negro. Hasta ahorita no he podido encontrar la forma de substituirlo. ¿Tienes alguna idea de cómo puedo hacerlo?

Saludos y Gracias por tu respuesta.

NotaPublicado: 2006-09-20 17:37 @775
por explorer
Para decodificar las entidades como '=2E' puedes usar alguno de los módulos ya existentes para eso, como el MIME::Decoder::QuotedPrint.

Para el tema del html, cuando tengas un rato, mírate el perlfaq9.

NotaPublicado: 2006-09-21 19:14 @843
por nrikex
Gracias, ya estoy estudiando los links y seguramente pronto estare haciendo preguntas

Saludos