Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

expresiones regulares...

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Nov 14, 2006 6:46 pm
scorpion
Perlero Nuevo
Perlero Nuevo
Registrado: 31 May 2006
Mensajes: 21
expresiones regulares... Responder citando

hola a todos...

resulta que estoy extrayendo valores de un fichero de configuración de formato:

Código:
nombre1 = cadena1
nombre2 = cadena2
......

tengo el siguiente código.

Perl:
while (<LOG>) {
   chomp;
   next if !/^\s*(\w+)\s*=\s*(\w[\s\w]+\w)\s*$/;
   $var{$1} = $2;
 }

este me funciona... PEROOOOO si una de las cadenas tiene un punto (.) ya no me lo toma.... ¿¿¿ cómo podría modificar la linea de la expresión regular para poder obtener el valor ???

Gracias por adelantado...

saludos...

scorpion....
Mensaje Mar Nov 14, 2006 6:49 pm
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 720
Ubicación: Buenos Aires
Responder citando

Porque no usas la función split y ya...

Perl:
my @lines = <LOG>;
foreach my $line (@lines) {
  my ($key,$value) = split(/=/,$line);
}


Espero que te sirva

Saludos
Mensaje Mar Nov 14, 2006 6:55 pm
scorpion
Perlero Nuevo
Perlero Nuevo
Registrado: 31 May 2006
Mensajes: 21
Responder citando

pero es que con esa función tomaría los espacios en blanco al principio y al final de las nombre y las cadenas si los tuvieran.... también quiero quitarle los espacios en blanco....

gracias por tan pronta respuesta... ¿¿¿ alguna nueva idea ???

gracias por adelantado...

scorpion...
Mensaje Mar Nov 14, 2006 7:41 pm
jclp77
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
Responder citando

Hola, la verdad no se muy bien programar en Perl, pero tal vez este ejemplo rudimentario te pueda servir. Espero sea lo que necesitas

Perl:
@lines=("  nombre1 12   1 = cadena1 11 11 ", "  no mb re 2 =   ca den a2 ");

foreach my $line (@lines){
  my ($key,$value) = split(/=/,$line);
  $key =~ s/^\s+|\s+$//g;
  $value =~ s/^\s+|\s+$//g;
  print "$key=$value\n";
}



Saludos
Mensaje Mar Nov 14, 2006 8:26 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
Responder citando

Menos es más.

Vemos, según tu expresión regular, que en la primera parte, antes del '=' hay caracteres alfanuméricos. El problema es si aparece ahí un '.'.

Y en la segunda parte, hay mezcla de espacios en blanco y alfanuméricos. Es decir, de todo.

Entonces, al principio, necesitas buscar todo aquello que no sea un espacio en blanco, junto que todo aquello que no sean espacios al final de la línea, después:

Perl:
while (<LOG>) {
  chomp;
  if ( /^\s*(\S+)\s*=\s*(.+)\s*$/ ) {
    $var{$1} = $2;
  }
}
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group