• Publicidad

Acotar expresión regular

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

Re: Acotar expresión regular

Notapor explorer » 2014-04-01 13:01 @584

Siempre se puede poner un

next if /^%+/;

para que salte esa línea.
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

Publicidad

Re: Acotar expresión regular

Notapor pablgonz » 2014-04-01 22:45 @989

Genial, lo dejé así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14.2;
  3. use re 'eval';
  4. use autodie;                                            # muere si ocurre un error
  5. use File::Basename;                                     # separa el archivo de entrada
  6.  
  7. ### Argumentos --------------------------------------------------------------
  8. @ARGV == 1  or die "Uso: $0 <archivo TeX a procesar>\n";
  9. my $nombre_archivo = shift;
  10. -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
  11.  
  12. ### Arreglo de la extensión -------------------------------------------------
  13. my @SuffixList = ('.tex', '', '.ltx');                  # posible extensión
  14. my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
  15. $ext = '.tex' if not $ext;
  16.  
  17. ### Parte 1: Comentamos bloques de texto a lo largo de todo el archivo -------
  18.  
  19. my @lineas;
  20. {
  21.     open my $FILE, $nombre_archivo;
  22.     @lineas = <$FILE>;
  23.     close $FILE;
  24. }
  25.  
  26. my %cambios = (
  27.     '\pspicture'                => '\TRICKS',
  28.     '\endpspicture'             => '\ENDTRICKS',
  29.  
  30.     '\begin{MYexample'          => '\begin{MYEXAMPLE',
  31.     '\end{MYexample'            => '\end{MYEXAMPLE',
  32.  
  33.     '\begin{pspicture'          => '\begin{TRICKS',
  34.     '\end{pspicture'            => '\end{TRICKS',
  35.  
  36.     '\begin{postscript}'        => '\begin{POSTRICKS}',
  37.     '\end{postscript}'          => '\end{POSTRICKS}',
  38.    
  39.     '\begin{document}'          => '\begin{DOCUMENT}',
  40.     '\end{document}'            => '\end{DOCUMENT}',
  41. );
  42.  
  43. my $ENTORNO  = qr/(?: verbatim\*? | LTXexample | tcblisting | mybox | comment )/xi;
  44. #    
  45. my $DEL;
  46.  
  47. for (@lineas) {
  48.     if (/^\\begin\{($ENTORNO)(?{ $DEL = $^N })\}/ .. /^\\end\{$DEL\}/) {
  49.         while (my($busco, $cambio) = each %cambios) {
  50.             s/\Q$busco\E/$cambio/g;
  51.         }
  52.     }
  53.   print;  
  54.  }
  55.  
  56. ## Escritura del resultado
  57. open my $SALIDA, '>', "$name-out$ext";
  58. print   $SALIDA @lineas;
  59. close   $SALIDA;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
pero, modifica una línea que no debería, en este caso, el último \end{document}. Si el archivo de entrada es de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \begin{comment}
  3. \begin{document} cambia
  4. \end{document} cambia
  5. \end{comment}
  6. \begin{document} esta línea no debería cambiar
  7. Test
  8. \begin{comment}
  9. \begin{document} cambia
  10. \end{document} cambia
  11. \end{comment}
  12. Texto'
  13. \begin{verbatim*}
  14. \psset{unit=1.0cm}
  15. \begin{pspicture}[showgrid=true](4,2) cambia
  16.   \psscaleboxto(8,2){foo bar baz}
  17. \end{pspicture} cambia
  18. \end{verbatim*}
  19.  
  20. \end{document} esta línea no debería cambiar
  21.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Cambia el último \end{document} por \end{DOCUMENT} siendo que este no está en el rango sobre el que deseo hacer modificaciones, creo que el problema está en el * que uso en verbatim\*? el cual ya está escapado.

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

Re: Acotar expresión regular

Notapor explorer » 2014-04-02 06:26 @310

Tienes razón.

El problema está en que $DEL va guardando los delimitadores que encontramos, y en el caso de 'verbatim*', lo que estamos indicando, en la segunda parte del biestable, es que busque por un delimitador '\end{verbatim*}'. Es decir, queremos que finalice el rango con una 'm' opcional seguida inmediatamente por la llave de cierre... y eso no se cumple en todo el resto del archivo. Por eso, desde que captura el primer 'verbatim*', hace los cambios a todas las líneas.

La solución es indicar que ese asterisco es literal, no un comodín de un patrón.

Cambia la línea 48 a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if (/^\\begin\{($ENTORNO)(?{ $DEL = "\Q$^N" })\}/ .. /^\\end\{$DEL\}/) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y así, en $DEL guardamos la versión "escapada" del delimitador, y la segunda parte del biestable sí que encuentra la fila del final del rango.
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

Re: Acotar expresión regular

Notapor pablgonz » 2014-04-02 22:07 @963

Ahora funciona perfecto, un par de consultas (para variar):
  • En la línea que me propones usas $DEL = "\Q$^N" no se debería colocar también \E.
  • Como el hash no es conmutativo y en otra parte del script necesitaré deshacer los cambios que hice en un principio, pero, ahora ya no tendré la limitación de buscarlos dentro de los rangos de palabras, sino modificar todas las apariciones de esas palabras en el $cuerpo del archivo, me gustaría hacerlos usando una expresión regular y un hash, algo como esto:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. open my $ENTRADA, '<', "test.tex";
    2. my $archivo;
    3. {
    4.     local $/;
    5.     $archivo = <$ENTRADA>;
    6. }
    7. close   $ENTRADA;
    8.  
    9. ## Partición del documento
    10. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) (.+) (^ \\end{document} .*) \z/msx;
    11.  
    12. my %cambios = (
    13.     '\TRICKS'           =>  '\pspicture',
    14.     '\ENDTRICKS'        =>  '\endpspicture',
    15.     '\begin{MYEXAMPLE'  =>  '\begin{MYexample',
    16.     '\end{MYEXAMPLE'    =>  '\end{MYexample',
    17.     '\begin{TRICKS'     =>  '\begin{pspicture',
    18.     '\end{TRICKS'       =>  '\end{pspicture',
    19.     '\begin{POSTRICKS}' =>  '\begin{postscript}',
    20.     '\end{POSTRICKS}'   =>  '\end{postscript}'  ,
    21.     '\begin{DOCUMENT}'  =>  '\begin{document}'  ,
    22.     '\end{DOCUMENT}'    =>  '\end{document}'    ,
    23. );
    24.  
    25. $cuerpo=~ s/\Q$busco\E/$cambio/g;
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
    y aquí es donde me pierdo, no sé si puedo usar el mismo nombre para el hash, es decir, si reescribe las claves que ya usé antes o debo darle otro nombre y cómo hacerlo correr en la expresión regular.
Totalmente agradecido,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor pablgonz » 2014-04-03 22:02 @960

Ya aclaré mi duda, el hash se sobreescribe y basta con usar un for para lo que deseo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for ($cuerpo) {
  2.         while (my($busco, $cambio) = each %cambios) {
  3.             s/\Q$busco\E/$cambio/g;
  4.         }
  5.         print;
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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

Re: Acotar expresión regular

Notapor explorer » 2014-04-04 10:08 @463

¿Un bucle for de un solo elemento? Es igual a si no pusieras nada.

Lo que has escrito se puede reducir a esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         while (my($busco, $cambio) = each %cambios) {
  2.             $cuerpo =~ s/\Q$busco\E/$cambio/g;
  3.         }
  4.  
  5.         print $cuerpo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es decir: aplicar los %cambios a $cuerpo.
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

Re: Acotar expresión regular

Notapor pablgonz » 2014-04-05 22:05 @962

Sí, tienes razón, luego de leer un poco más comprendí que for no era el indicado, lo dejaré como tú lo propones. Otra consulta, con la siguiente expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cuerpo =~ s/ ^\\psset\{.+?\} \s+ (\\includegrahicx\{name-fig-\d*\})/$1/gms;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

intenté quitar la palabra \psset{cualquier cosa incluso saltos de línea} que preceda a la palabra \includegrahicx{name-fig-numero} pero, no me funciona, he cambiado varias veces los modificadores y no he podido dar con la correcta.

Saludos,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor explorer » 2014-04-06 06:57 @331

Por de pronto, veo que estás usando espacios en blanco dentro del patrón, sin poner el calificador '/x'.
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

Re: Acotar expresión regular

Notapor pablgonz » 2014-04-06 18:31 @813

Tienes toda la razón, solo recordaba que /x era para colocar comentarios... Me olvidé por completo de que es el modificador preciso para esta circunstancia. Al final lo dejé así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cuerpo =~ s/ ^\\psset\{.+?\}\s*(\\includegrahicx\{name-fig-\d*\})/$1/gmsx;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Anterior

Volver a Básico

¿Quién está conectado?

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

cron