• Publicidad

Expresiones Regulares Dinámicas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Expresiones Regulares Dinámicas

Notapor Quique3008 » 2011-01-26 15:35 @691

Hola... Soy nuevo por aquí... Quiero aportar lo más que se pueda aquí... En fin. este es mi problema.

Trato de buscar en un archivo de texto ciertas cadenas. Para esto, las cadenas que busco las guardo en un array; después, con la instrucción foreach() recorro el array y dentro de éste utilizo un foreach() para recorrer el archivo de texto... así buscando las cadenas uno por uno.

Aquí un pedazo de código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Ejemplo = el  array @txt tendría los valores 'cosa','auto'
  2. foreach $txt(@txt) {
  3.     #say $txt; Aquí me daría los valores del array
  4.  
  5.     foreach my $line2 (@log) {
  6.         chomp $line2;
  7.      
  8.         $line2 =~ s/^\s+//;
  9.         $line2 =~ s/\s+$//;
  10.  
  11.         if ($line2 =~ m/^$txt/) { #Aquí es donde quiero que la variable $txt se reemplace por el valor del array.
  12.             say $line2;
  13.         }
  14.     }
  15.     say "-------------------------------------------------------"; #Aquí me separaría cada bloque de líneas encontrada con el valor del array que recorre el foreach uno por uno
  16. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Bueno, el problema es que siempre me da true... pero no me lanza las líneas que contiene el valor del array sino todas las líneas que contiene el archivo de texto...

He buscado y al parecer tiene algo que ver con la función eval().
Quique3008
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-01-26 15:03 @669

Publicidad

Re: Expresiones Regulares Dinámicas

Notapor explorer » 2011-01-26 15:49 @700

Bienvenido a los foros de Perl en Español, Quique3008.

Yo no veo ningún error. He hecho la siguiente prueba, y me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. open my $fh, q[<], '/etc/login.defs';
  6. my @log = <$fh>;
  7. close $fh;
  8.  
  9. my @txt = qw( PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE );
  10.          
  11. for my $txt (@txt) {
  12.  
  13.     for my $line2 (@log) {
  14.         chomp $line2;
  15.      
  16.         $line2 =~ s/^\s+//;
  17.         $line2 =~ s/\s+$//;
  18.  
  19.         if ($line2 =~ m/^$txt/) {
  20.             say $line2;
  21.         }
  22.     }
  23.     say "-" x 80;
  24. }
  25. __END__
  26. PASS_MAX_DAYS   99999
  27. --------------------------------------------------------------------------------
  28. PASS_MIN_DAYS   0
  29. --------------------------------------------------------------------------------
  30. PASS_WARN_AGE   7
  31. --------------------------------------------------------------------------------
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresiones Regulares Dinámicas

Notapor Quique3008 » 2011-01-26 16:12 @716

Gracias, amigo... has respondido muy rápido :shock: ... pero este es un ejemplo del archivo de texto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 4.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 5.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 2.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 3.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Back.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Disc.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/08 - Trees.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/06 - Improv (including Nola and Etude no. 7).flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/05 - Travel Weary Capricorn.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/07 - Mars.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/01 - 21st Century Schizoid Man.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/02 - Drop In.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/03 - I Talk to the Wind.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/04 - Epitaph.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Folder.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.log
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.cue
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC].md5
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/info.txt
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.m3u
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Artwork/front.bmp
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Artwork/tray.bmp
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/03 - Red.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/04 - Dinosaur.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/10 - Sheltering Sky.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/02 - Thela Hun Ginjeet.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/05 - One Time.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/06 - VROOOM VROOOM.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/08 - Neurotica.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/09 - Elephant Talk.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/07 - Waiting Man.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/01 - Conundrum.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd1.log
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/KCCC38 Live in Philadelphia (1996) [FLAC] cd1.cue
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd1.m3u
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/02 - THRAK.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/07 - 21st Century Schizoid Man.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/05 - Lark's Tongues in Aspic Part II.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/04 - Indiscipline.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/01 - B'Boom.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/03 - Sex, Sleep, Eat, Drink, Dream.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/06 - Prism.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/08 - VROOOM.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/09 - Coda- Marine 475.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd2.log
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/KCCC38 Live in Philadelphia (1996) [FLAC] cd2.cue
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd2.m3u
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC].md5
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Info.txt
Combined.txt
EOF
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En el array estarían los directorios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Cada uno de esos es un valor en el array... entonces con esos foreach() recorro el archivo y mi idea es que solamente me muestre las líneas que tengan esas cadenas.

Según el código me debería lanzar así el resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 4.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 5.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 2.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Booklet 3.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Back.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Artwork/Disc.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/08 - Trees.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/06 - Improv (including Nola and Etude no. 7).flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/05 - Travel Weary Capricorn.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/07 - Mars.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/01 - 21st Century Schizoid Man.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/02 - Drop In.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/03 - I Talk to the Wind.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/04 - Epitaph.flac
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/Folder.jpg
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.log
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.cue
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC].md5
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/info.txt
King Crimson - KCCC1 Live at the Marquee 1969 (1998) [FLAC]/King Crimson - Live at the Marquee 1969.m3u
-------------------------------------------------------------------------------------------------------------------------
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Artwork/front.bmp
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Artwork/tray.bmp
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/03 - Red.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/04 - Dinosaur.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/10 - Sheltering Sky.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/02 - Thela Hun Ginjeet.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/05 - One Time.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/06 - VROOOM VROOOM.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/08 - Neurotica.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/09 - Elephant Talk.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/07 - Waiting Man.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/01 - Conundrum.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd1.log
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/KCCC38 Live in Philadelphia (1996) [FLAC] cd1.cue
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd1/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd1.m3u
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/02 - THRAK.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/07 - 21st Century Schizoid Man.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/05 - Lark's Tongues in Aspic Part II.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/04 - Indiscipline.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/01 - B'Boom.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/03 - Sex, Sleep, Eat, Drink, Dream.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/06 - Prism.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/08 - VROOOM.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/09 - Coda- Marine 475.flac
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd2.log
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/KCCC38 Live in Philadelphia (1996) [FLAC] cd2.cue
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/cd2/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC] cd2.m3u
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Thumbnail.jpg
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC].md5
King Crimson - KCCC38 Live in Philadelphia (1996) [FLAC]/Info.txt
--------------------------------------------------------------------------------------------------------------------------------------------------
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema radica en que nunca me muestra nada, no se ejecuta la instrucción y solo me muestra los guiones "-------------" :( :(
Quique3008
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-01-26 15:03 @669

Re: Expresiones Regulares Dinámicas

Notapor explorer » 2011-01-26 17:40 @777

El problema está en que las cadenas a comparar contienen corchetes y paréntesis, y esos caracteres son significativos para las expresiones regulares.

Lo que hay que hacer es "escapar" el significado de esos caracteres dentro de la expresión. Es decir, poner un '\' delante de cada uno de ellos. Quedaría algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @txt = (
  2.     'King Crimson - KCCC1 Live at the Marquee 1969 \(1998) \[FLAC\]',
  3.     'King Crimson - KCCC38 Live in Philadelphia \(1996\) \[FLAC\]'
  4. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero... es un rollo :)

Y para resolver rollos, ya están los ordenadores...

Perl permite "escapar" estos caracteres.

Solo tienes que modificar la expresión regular así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($line2 =~ m/^\Q$txt/) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Solo hemos agregado el "\Q", que es uno de los operadores de cadenas de caracteres de Perl. Su misión es "escapar" todo carácter "extraño" que encuentre en el texto que le sigue, hasta que encuentre un "\E" o el final de cadena.

Más información, en perldoc -f quotemeta.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresiones Regulares Dinámicas

Notapor Quique3008 » 2011-01-26 17:53 @787

¡Eres un máster, amigo! Muchísimas gracias... Me ha servido totalmente :mrgreen:

Es una gran comunidad. Leeré el doc para saber mucho más :D
Quique3008
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-01-26 15:03 @669


Volver a Intermedio

¿Quién está conectado?

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