• Publicidad

Problema de macheo con Regexp desde JSON

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problema de macheo con Regexp desde JSON

Notapor damian1510 » 2012-11-09 10:04 @461

Hola, me surgió el siguiente problema.

Recibo en un JSON unos parámetros de configuración para conectarme a un sftp o ftp en los cuales debo recorrer un directorio y colectar los archivos que tengan un determinado nombre. Para esto uno de los parámetros en el JSON es una regExp.

En una parte del código tengo lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $file (@files) {
  2.     if ( $file =~ $self->{regExp} ) {
  3.         print "$file machea con: " . $self->{regExp} . "\n";
  4.         $self->moveFile($file);        # Función que hace un get y lo envia a un directorio local.
  5.     }
  6.     else { print "$file no machea con: " . $self->{regExp} . "\n" }
  7. }
  8. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El tema es que $self->{regExp} puede tener cualquier tipo de regExp, por ejemplo "/mr\d+/" o incluso contener "m/mr\d+/g".

Probé varias formas y no he podido hacer que la regExp machee con el $file.

La regExp al momento de ser comprada con '=~' es un string. No sé si estoy errado o no, pero por lo que estuve investigando tendría que poder compilarla al momento de la comparación, o hacerle algún tratamiento para que la interprete como tal, pero no encuentro manera.

Espero que puedan ayudarme.
¡Gracias!
Última edición por explorer el 2012-11-09 10:20 @472, editado 1 vez en total
Razón: Formateado de código con Perltidy
damian1510
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-11-07 15:28 @686

Publicidad

Re: Problema de macheo con Regexp desde JSON

Notapor explorer » 2012-11-09 10:28 @478

En efecto, si no dices nada, la expresión regular se encuentra con una cadena de caracteres, y no con un patrón.

Lo que debes hacer es convertir esa cadena de caracteres en un patrón:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $regexp = qr($self->{regExp});      # Creamos un patrón
  2.  
  3. for my $file (@files) {
  4.     if ($file =~ $regexp ) {
  5.         print "$file machea con: " . $self->{regExp} . "\n";
  6.         $self->moveFile($file);        # Función que hace un get y lo envia a un directorio local.
  7.     }
  8.     else {
  9.         print "$file no machea con: " . $self->{regExp} . "\n";
  10.     }
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema está ahora cuando recibes algo como 'm//'. Para que sea correcto el código anterior, deberías antes quitar la 'm' y los delimitadores, antes de pasarlo por el operador qx().

Y otro problema a mayores es la opción '/g'. En la mayor parte de los casos, te valdrá con quitarla, igual que con la 'm' primera (la opción '/g' te serviría si fueras a crear un bucle de búsqueda contra $file, pero parece que no quieres hacer eso).

Creo que sería posible una solución más cómoda y clara, haciendo un eval(), pero ahora no tengo tiempo de investigar...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

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