• Publicidad

Buscar palabras en un texto

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

Buscar palabras en un texto

Notapor colorado » 2011-02-24 16:07 @713

Tengo los siguientes archivos:

log.txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
blancanieves -animacion
Balada Triste De Trompeta -drama
Cisne Negro -thriller
Caracremada -drama
jungla de cristal -accion
Saw VII -terror
Los Próximos Tres Días thriller
El Oso Yogui -animacion
Sin Retorno -drama
El Santuario -accion
...............
...............
....................
.............
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



busca.txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
accion
animacion
drama
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Con el siguiente script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (BUSCA, 'busca.txt');
  2. my @busca = <BUSCA>;
  3. chomp @busca;
  4. close(BUSCA);
  5.  
  6. for (my $i = 0; $i < @busca; $i++) {
  7.     open(LOG, "<   log.txt");
  8.     open(LOGSAL, "> encontradas.txt");
  9.     my @contenido = <LOG>;
  10.     foreach my $linea (@contenido)
  11.     {
  12.         if ($linea =~ m/$busca[$i]/)
  13.         {
  14.             print LOGSAL $linea;
  15.         }
  16.     }
  17.     close(LOG);
  18.     close(LOGSAL);
  19. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que necesito es esta salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
jungla de cristal -accion
El Santuario -accion
blancanieves -animacion
El Oso Yogui -animacion
Balada Triste De Trompeta -drama
Caracremada -drama
Sin Retorno -drama
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo consigo cambiando esta línea:
open(LOGSAL, "> encontradas.txt");
por,
open(LOGSAL, ">> encontradas.txt");

Pero quiero hacerlo sin cambiar esa línea.

Cambiando esta línea:
print LOGSAL $linea;
por,
print $linea;

La salida por pantalla es buena.

¿Cómo puedo hacerlo?

Un saludo
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Publicidad

Re: Buscar palabras en un texto

Notapor explorer » 2011-02-24 16:40 @736

Coloca la línea 8 en la 5, y la 18 en la 20.

Otra versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;      # sentido común
  3. use autodie;            # autosacrificio
  4. use Perl6::Slurp;                    
  5.  
  6. my @log      = slurp 'log.txt'  , {chomp => 1};
  7. my @busca    = slurp 'busca.txt', {chomp => 1};
  8.  
  9. my $búsqueda = join q[|], @busca;       # construimos una regex con alternativas
  10.  
  11. open my $ENCONTRADAS, q[>], 'encontradas.txt';
  12.  
  13. for my  $log (@log) {                   # para todos los @log
  14.  
  15.     if ($log ~~ /$búsqueda/o) {         # si en el $log encontramos la $búsqueda
  16.  
  17.         say $ENCONTRADAS $log;          # lo imprimimos
  18.     }
  19. }
  20.  
  21. close $ENCONTRADAS;
  22.  
  23. __END__
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: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar palabras en un texto

Notapor colorado » 2011-02-24 17:16 @761

Muy bueno, explorer, muchas gracias.

No te imaginarias el tiempo que he invertido para intentar solucionarlo :oops: y tu con dos movimientos... le diste jaque mate.

Otra cuestión:

Me gustaría que los resultados se mostraran en orden de estado de log.txt,
para que el resultado de encontradas.txt quedara así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
blancanieves -animacion
Balada Triste De Trompeta -drama
Caracremada -drama
jungla de cristal -accion
El Oso Yogui -animacion
Sin Retorno -drama
El Santuario -accion
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Cómo lo hago?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Buscar palabras en un texto

Notapor explorer » 2011-02-24 17:21 @764

Debes cambiar el orden de los bucles for(). Es decir, el exterior debe recorrer las líneas de log.txt. De esa manera, son esas entradas las que marcarán la forma de la salida.

Precisamente, así es como está en mi versión, y por eso da la salida en el orden que pides.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar palabras en un texto

Notapor colorado » 2011-02-24 17:27 @769

Ok, entendido, máquina.

Entrenaré con la otra versión y con el cambio de los bucles for().

Muy agradecido :P
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658


Volver a Básico

¿Quién está conectado?

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

cron