Página 6 de 6

Re: Acotar expresión regular

NotaPublicado: 2014-04-01 13:01 @584
por explorer
Siempre se puede poner un

next if /^%+/;

para que salte esa línea.

Re: Acotar expresión regular

NotaPublicado: 2014-04-01 22:45 @989
por pablgonz
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.005 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.002 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.

Re: Acotar expresión regular

NotaPublicado: 2014-04-02 06:26 @310
por explorer
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.

Re: Acotar expresión regular

NotaPublicado: 2014-04-02 22:07 @963
por pablgonz
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

Re: Acotar expresión regular

NotaPublicado: 2014-04-03 22:02 @960
por pablgonz
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

Re: Acotar expresión regular

NotaPublicado: 2014-04-04 10:08 @463
por explorer
¿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.

Re: Acotar expresión regular

NotaPublicado: 2014-04-05 22:05 @962
por pablgonz
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

Re: Acotar expresión regular

NotaPublicado: 2014-04-06 06:57 @331
por explorer
Por de pronto, veo que estás usando espacios en blanco dentro del patrón, sin poner el calificador '/x'.

Re: Acotar expresión regular

NotaPublicado: 2014-04-06 18:31 @813
por pablgonz
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