• Publicidad

Imprimir desde un punto hasta otro 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.

Imprimir desde un punto hasta otro en un texto

Notapor boteropepe » 2011-01-19 08:05 @378

Hola, necesito hacer un programa muy parecido a otro para el que también pedí ayuda aquí: lo que quiero es tomar de un fichero solamente lo que aparece entre comillas dobles, tras 'sent:'

TEXTO:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
sent: "todo lo que quiero
es que
esto se quede
como está"
Blabla bla bla bla bla
sent: "estos son los
datos
del problema"
Bla bla bla bla bla bla bla
sent: "no estoy de acuerdo"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


De momento, lo que he hecho es esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. # use strict;
  4. # use warnings;
  5.  
  6. my $in_pattern = 0;
  7.  
  8. while (<>) {
  9.  
  10.   if ($_ =~ /sent:\s*"/) {
  11.     $in_pattern = 1;
  12.   } elsif ($_ =~ /"/) {
  13.     $in_pattern = 0;
  14.   }
  15.  
  16.   if ($in_pattern) {
  17.     print "$_\n";
  18.   }
  19.  
  20. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Entiendo perfectamente por qué así la última línea (la de las comillas de cierre) no se imprima. Lo que pasa es que no sé si existe algo que me permita abordar el problema de esta forma, haciendo que también se imprima la línea de las comillas de cierre, o si lo que debería es hacer otra cosa.

Muchas gracias.
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Publicidad

Re: imprimir desde un punto hasta otro en un texto

Notapor explorer » 2011-01-19 11:26 @518

En este caso la solución es sencilla porque los datos están entrecomillados. Así que con una sola expresión regular, vale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use File::Slurp;
  4.  
  5. my $fichero = read_file('kk.txt');
  6.  
  7. while ($fichero =~ /sent: "(.+?)"/gosm) {
  8.  
  9.     say "[$1]";
  10. }
  11.  
  12. __END__
  13. [todo lo que quiero
  14. es que
  15. esto se quede
  16. como está]
  17. [estos son los
  18. datos
  19. del problema]
  20. [no estoy de acuerdo]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usamos las opciones /s y /m para indicar que $fichero está compuesto de varias líneas, y con la /g, buscamos de forma repetida todos los patrones de coincidencia.
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: Imprimir desde un punto hasta otro en un texto

Notapor boteropepe » 2011-01-20 10:29 @479

Muchas gracias, pero ¿cómo lo podría hacer sin utilizar esas librerías?
Probé así, pero tampoco funciona (solo se imprime la primera ocurrencia):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. undef $/;
  7.  
  8. while (<>) {
  9.  
  10.   if ($_ =~ /sent: ("[^"]*")/gosm) {
  11.     print "[$1]\n";
  12.   }
  13. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Re: Imprimir desde un punto hasta otro en un texto

Notapor explorer » 2011-01-20 12:40 @569

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. undef $/;
  6.  
  7. my $fichero = <>;
  8.  
  9. while ($fichero =~ /sent: ("[^"]*")/gosm) {
  10.     print "[$1]\n";
  11. }
  12.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Al indefinir $/, con solo una lectura del fichero ya lo tenemos todo cargado, por lo que no necesitamos hacer un bucle por las líneas. Luego sí necesitamos usar un bucle para que la opción /g nos encuentre todas las ocurrencias, dentro del $fichero.
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: Imprimir desde un punto hasta otro en un texto

Notapor boteropepe » 2011-01-20 14:08 @630

Muchas gracias por la explicación, no sabía si lo podía hacer así (y era que no).
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676


Volver a Básico

¿Quién está conectado?

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