• Publicidad

Extraer datos de la línea inferior

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Extraer datos de la línea inferior

Notapor nrikex » 2006-09-19 12:21 @556

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
In a World without walls, who need Windows?
nrikex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-09-15 15:11 @674

Publicidad

Notapor AkonD » 2006-09-19 12:47 @574

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.002 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
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor explorer » 2006-09-19 16:35 @733

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor nrikex » 2006-09-19 18:34 @815

Gracias a ambos, ambas respuestas me fueron muy utiles. ¡¡¡¡ LO MEJOR es la rapidez con que fueron contestadas !!!!
In a World without walls, who need Windows?
nrikex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-09-15 15:11 @674

Notapor explorer » 2006-09-20 10:12 @467

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor AkonD » 2006-09-20 10:54 @496

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
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor nrikex » 2006-09-20 11:44 @530

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.
In a World without walls, who need Windows?
nrikex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-09-15 15:11 @674

Notapor explorer » 2006-09-20 17:37 @775

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor nrikex » 2006-09-21 19:14 @843

Gracias, ya estoy estudiando los links y seguramente pronto estare haciendo preguntas

Saludos
In a World without walls, who need Windows?
nrikex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-09-15 15:11 @674


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron