• Publicidad

Unir dos expresiónes regulares

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

Unir dos expresiónes regulares

Notapor pablgonz » 2014-12-13 13:58 @624

Hola a todos, nuevamente. Estoy tratando de armar un script para modificar cierto texto. Si el archivo de entrada es de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. % Las líneas que estan en
  3. % éste sector no deben modificarse
  4. \begin{document}
  5. Texto texto texto sin *
  6.  
  7. un espacio antes \pspicture(4,2)(8,1)
  8. \psscaleboxto(8,2){foo bar baz}
  9.  
  10. \endpspicture
  11.  
  12. Mas Texto usando * [...](,)
  13. Un texto antes\pspicture*[
  14. showgrid
  15. ](5,5)(2,2)
  16.   \pscustom[fillcolor=red!20, fillstyle=solid]{%
  17.    \lineto(0,0)
  18.     \closepath}
  19. \endpspicture
  20.  
  21. Más Texto usando * (,)(,)
  22. \pspicture*(5,5)(2,2)
  23.   \pscustom[fillcolor=red!20, fillstyle=solid]{%
  24.     \pscspline(0,3)(4,2)(5,0)
  25.     \lineto(0,0)
  26.     \closepath}
  27. \endpspicture
  28. \end{document}
  29.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El archivo de salida que deseo es éste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. % Las líneas que estan en
  3. % éste sector no deben modificarse
  4. \begin{document}
  5. Texto texto texto sin *
  6.  
  7. un espacio antes \begin{pspicture}(4,2)(8,1)
  8. \psscaleboxto(8,2){foo bar baz}
  9.  
  10. \end{pspicture}
  11.  
  12. Mas Texto usando * [...](,)
  13. Un texto antes\begin{pspicture*}[
  14. showgrid
  15. ](5,5)(2,2)
  16.   \pscustom[fillcolor=red!20, fillstyle=solid]{%
  17.    \lineto(0,0)
  18.     \closepath}
  19. \end{pspicture*}
  20.  
  21. Más Texto usando * (,)(,)
  22. \begin{pspicture*}(5,5)(2,2)
  23.   \pscustom[fillcolor=red!20, fillstyle=solid]{%
  24.     \pscspline(0,3)(4,2)(5,0)
  25.     \lineto(0,0)
  26.     \closepath}
  27. \end{pspicture*}
  28. \end{document}
  29.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Utilizo el siguiente script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.18;
  3. use strict;                                                     # Somos estrictos
  4. use autodie;                                            # muere si ocurre un error
  5. use File::Basename;                                     # separa el archivo de entrada
  6. use File::Path;                     # Para crear y remover directorios
  7. #------------------------ Constantes -----------------------------------
  8. my $imageDir = 'images/';                               # directorio de imágenes
  9. my $imgCn = 1;                  # Counter for PSTexample
  10. #--------------------- Arreglo de la extensión -------------------------
  11. my @SuffixList = ('.tex', '', '.ltx');               # posible extensión
  12. my ($name, $path, $ext) = fileparse($ARGV[0], @SuffixList);
  13. $ext = '.tex' if not $ext;
  14.  
  15. #---------------- Creamos el directorio para las imágenes --------------
  16. -e $imageDir or mkdir($imageDir,0744) or die "No puedo crear $imageDir: $!\n";
  17.  
  18. #------------------- Abrimos el archivo -------------------------------
  19. open my $ENTRADA, '<', "$name$ext";
  20. my $archivo;
  21. {
  22.     local $/;
  23.     $archivo = <$ENTRADA>;
  24. }
  25. close   $ENTRADA;
  26.  
  27. #--------------------- Dividimos el archivo de entrada -----------------
  28. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) (.+) (^ \\end{document} .*) \z/msx;
  29.  
  30. $cuerpo =~ s/\\pspicture\*(.+?)\\endpspicture/\\begin{pspicture\*}$1\\end{pspicture\*}/gms;
  31. $cuerpo =~ s/\\pspicture(.+?)\\endpspicture/\\begin{pspicture\*}$1\\end{pspicture}/gms;
  32.  
  33. open my $SALIDA, '>', "$name-out$ext";
  34.     print $SALIDA <<"EOC";
  35. $cabeza$cuerpo$final
  36. EOC
  37. close $SALIDA;
  38.  
  39. __END__
  40.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El problema lo tengo con el * entre
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \pspicture ... \endpspicture 

y
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \pspicture* ... \endpspicture 

puesto que ambos rangos en los cuales deseo hacer los cambios terminan de igual manera y no logro dar con una única expresión regular que haga los cambios que necesito, es decir, si encuentra \pspicture ... \endpspicture cambie a \begin{pspicture} ... \end{pspicture} y si encuentra \pspicture* ... \endpspicture cambie a \begin{pspicture*} ... \end{pspicture*}.

Agradecido de antemano.
Pablo.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Unir dos expresiónes regulares

Notapor explorer » 2014-12-14 14:45 @656

Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cuerpo =~ s/\\pspicture(\*)?(.+?)\\endpspicture/\\begin{pspicture$1}$2\\end{pspicture$1}/gms;
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: Unir dos expresiónes regulares

Notapor pablgonz » 2014-12-14 18:55 @830

Muchas gracias, es justo lo que buscaba, no se me había ocurrido capturar "*"...
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)


Volver a Básico

¿Quién está conectado?

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