• Publicidad

Ajustar nueva regla a script

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

Ajustar nueva regla a script

Notapor pablgonz » 2014-09-08 21:05 @920

Hola a todos una vez más. Estoy tratando de ajustar una nueva regla a un script (el cual funciona al 100%), pero no logro dar con ella. Lo que deseo hacer es convertir el siguiente texto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. Deseo modificar esto:
  2. \tcboxverb{\begin{pspicture} o \begin{pspicture*}} texto
  3. o esto
  4. texto \tcboxverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  5. o esto
  6. texto \myverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  7. o esto
  8. texto \myverb{\begin{pspicture} o \begin{pspicture*}} texto
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

es decir, deseo hacer una modificación dentro de las llaves { } que van seguidas de esas palabras:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \tcboxverb[corchete que puede o no estar]{aquí quiero cambiar las palabras} 

Sintáxis: [ Descargar ] [ Ocultar ]
  1. \myverb[corchete que puede o no estar]{aquí quiero cambiar las palabras} 

Lo que deseo siempre está en una línea (no ocupa más de una).

Traté de adaptar el siguiente script con el cual hago modificaciones en condiciones parecidas, claro que los delimitadores dentro de donde deseo hacer los cambios son los mismos al inicio y al final (si abre con { cierra con {, si abre con } cierra con }).

No sé si puedo adaptarlo dentro de este mismo script o quizás baste con una expresión regular.

El script es el siguiente (las palabras del hash son las mismas que deseo modificar):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.18.2;
  3. no warnings;
  4. use autodie;
  5.  
  6. @ARGV == 1 or die "Uso: $0 <archivo LaTeX a procesar\n";
  7.  
  8. my $nombre_archivo_entrada = shift;
  9.  
  10. -f $nombre_archivo_entrada or die "ERROR: No encuentro $nombre_archivo_entrada\n";
  11.  
  12.  
  13. ## Lectura del archivo
  14. open my $ENTRADA, '<', $nombre_archivo_entrada;
  15. undef $/;                                                                       # modo 'slurp'
  16. my $archivo_entrada = <$ENTRADA>;
  17. close   $ENTRADA;
  18.  
  19.  
  20. ## Partición del documento
  21. my($cabeza,$cuerpo,$final) = $archivo_entrada =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  22.  
  23.  
  24. ## Cambios a realizar
  25. my %cambios = (
  26.                 '\pspicture'            => '\TRICKS',
  27.                 '\endpspicture'         => '\ENDTRICKS',
  28.  
  29.                 '\begin{pspicture'      => '\begin{TRICKS',
  30.                 '\end{pspicture'        => '\end{TRICKS',
  31.  
  32.                 '\postscript'           => '\POSTRICKS',
  33.  
  34.                 '\begin{postscript}'    => '\begin{POSTRICKS}',
  35.                 '\end{postscript}'      => '\end{POSTRICKS}',
  36. );
  37.  
  38.  
  39. ## Variables y constantes
  40. my $no_del = "\0";
  41. my $del    = $no_del;
  42.  
  43. ## Reglas
  44. my $llaves      = qr/\{ .+? \}                                                                  /x;
  45. my $no_corchete = qr/(?:\[ .+? \])?                                                             /x;
  46. my $delimitador = qr/\{ (?<del>.+?) \}                                                          /x;
  47. my $verb        = qr/verb [*]?                                                                  /ix;
  48. my $lst         = qr/lstinline (?!\*) $no_corchete                                              /ix;
  49. my $mint        = qr/mint      (?!\*) $no_corchete $llaves                                      /ix;
  50. my $marca       = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1}                                /x;
  51. my $comentario  = qr/^ \s* \%+ .+? $                                                            /mx;
  52. my $definedel   = qr/\\ (?:   DefineShortVerb | lstMakeShortInline  ) $no_corchete $delimitador /ix;
  53. my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves                   /ix;
  54.  
  55.  
  56. ## Cambiar
  57. while ($cuerpo =~
  58.         /   $marca
  59.         |   $comentario
  60.         |   $definedel
  61.         |   $indefinedel
  62.         |   $del .+? $del
  63.         /pgmx) {
  64.  
  65.         my($pos_inicial, $pos_final) = ($-[0], $+[0]);                              # posiciones
  66.         my $encontrado = ${^MATCH};                                                 # lo encontrado
  67.  
  68.         given ($encontrado) {
  69.                 when (/$definedel/) {                                                   # definimos delimitador
  70.                         $del = $+{del};
  71.                         $del = "\Q$+{del}" if substr($del,0,1) ne '\\';                     # es necesario "escapar" el delimitador
  72.                 }
  73.                 when (/$indefinedel/) {                                                 # indefinimos delimitador
  74.                         $del = $no_del;
  75.                 }
  76.                 default {                                                               # Aquí se hacen los cambios
  77.                         while (my($busco, $cambio) = each %cambios) {
  78.                                 $encontrado =~ s/\Q$busco\E/$cambio/g;                          # es necesario escapar $busco, ya que contiene caracteres extraños
  79.                         }
  80.  
  81.                         substr $cuerpo, $pos_inicial, $pos_final-$pos_inicial, $encontrado; # insertamos los nuevos cambios
  82.  
  83.                         pos($cuerpo) = $pos_inicial + length $encontrado;                   # re posicionamos la siguiente búsqueda
  84.                 }
  85.         }
  86. }
  87.  
  88.  
  89. ## Escritura del resultado
  90. open my $SALIDA, '>', "test-out2.tex";
  91. print   $SALIDA "$cabeza\n$cuerpo\n$final\n";
  92. close   $SALIDA;
  93.  
  94. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
y el archivo de prueba es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{minted}
  3. \usepackage{pstricks-add}
  4. \newenvironment{postscript}{}{}
  5. \begin{document}
  6. Deseo modificar esto:
  7. \tcboxverb{\begin{pspicture} o \begin{pspicture*}} texto
  8. o esto
  9. texto \tcboxverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  10. o esto
  11. texto \myverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  12. o esto
  13. texto \myverb{\begin{pspicture} o \begin{pspicture*}} texto
  14.  
  15. Usamos \verb|\begin{pspicture} o \begin{pspicture*}| o \verb*|\begin{pspicture} o \begin{pspicture*}| (cambia)
  16. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  17. % esta línea debería modificarse \begin{pspicture} o \begin{pspicture*}
  18. Usamos \lstinline[hola]+\begin{pspicture} o \begin{pspicture*}+ y seguimos (cambia)
  19. Usamos \lstinline-\begin{pspicture} o \begin{pspicture*}- y seguimos (cambia)
  20. Esta línea debería quedar intacta \lstinline*[hola]+\begin{pspicture} o \begin{pspicture*}+ (no cumple por *)
  21. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  22. % esta línea debería modificarse \begin{pspicture} o \begin{pspicture*}
  23. Usamos \mint{algo}$\begin{pspicture} o \begin{pspicture*}$ y seguimos (cambia)
  24. Usamos \mint[hola]{algo}$\begin{pspicture} o \begin{pspicture*}$ y seguimos (cambia)
  25. Esta línea debería quedar intacta \mint[holas]#\begin{pspicture} o \begin{pspicture*}# (no cumple falta {})
  26. Esta línea debería quedar intacta \mint*#\begin{pspicture} o \begin{pspicture*}# (no cumple por *)
  27. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  28. % esta línea debería modificarse \begin{pspicture} o \begin{pspicture*}
  29.  
  30. \section{ShortVerb}
  31. \DefineShortVerb{\|}
  32. Usamos el delimitador barra |\begin{pspicture} o \begin{pspicture*}| (cambia)
  33. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  34. ahora lo cambiamos indefinimos
  35. %esta debería cambiar \begin{pspicture} o \begin{pspicture*}
  36. \UndefineShortVerb{\|}
  37. y ahora definimos el (más)+
  38. \DefineShortVerb{\+}
  39. Usamos el delimitador más +\begin{pspicture} o \begin{pspicture*}+ (cambia)
  40. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  41. \UndefineShortVerb{\+}
  42. y ahora definimos el (almohadilla)
  43. \DefineShortVerb{\#}
  44. Usamos el delimitador almohadilla #\begin{pspicture} o \begin{pspicture*}# (cambia)
  45. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  46.  
  47. \section{ShortInline}
  48. \lstMakeShortInline[algo]{|}
  49. Usamos el delimitador barra |\begin{pspicture} o \begin{pspicture*}| (cambia)
  50. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  51. ahora lo cambiamos indefinimos
  52. \lstDeleteShortInline{|}
  53. y ahora definimos el (más)+
  54. \lstMakeShortInline[algo]{+}
  55. Usamos el delimitador más +\begin{pspicture} o \begin{pspicture*}+ (cambia)
  56. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  57. \lstDeleteShortInline{+}
  58. y ahora definimos el (almohadilla)
  59. \lstMakeShortInline[algo]{#}
  60. Usamos el delimitador almohadilla #\begin{pspicture} o \begin{pspicture*}# (cambia)
  61. esta línea debería quedar intacta \begin{pspicture} o \begin{pspicture*}
  62.  
  63. %\begin{postscript} debería cambiar
  64. \begin{postscript} % queda =
  65. \psset{unit=1.0cm}
  66. \begin{pspicture}[showgrid=true](4,2)% queda =
  67.   \psscaleboxto(8,2){foo bar baz}
  68. \end{pspicture}% queda =
  69. \end{postscript}% queda =
  70.  
  71. \begin{pspicture*}(4,2)(8,1)% queda =
  72. \psset{unit=1.0cm}
  73. \psscaleboxto(8,2){foo bar baz}
  74. \end{pspicture*}% queda =
  75.  
  76. %%% \pspicture*(4,2)(8,1) o \begin{pspicture*}(4,2)(8,1) debería cambiar
  77. \pspicture*(4,2)(8,1)% queda =
  78. \psset{unit=1.0cm}
  79. \psscaleboxto(8,2){foo bar baz}
  80. \endpspicture% queda =
  81. % se puede \endpspicture o \end{pspicture*} debería cambiar
  82. % \pspicture(4,2)(8,1) o \begin{pspicture}(4,2)(8,1) debería cambiar
  83. \pspicture(4,2)(8,1)% queda =
  84. \psset{unit=1.0cm}
  85. \psscaleboxto(8,2){foo bar baz}
  86. \endpspicture% queda =
  87. %\endpspicture o \end{pspicture} debería cambiar
  88. \end{document}
  89.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

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

Publicidad

Re: Ajustar nueva regla a script

Notapor explorer » 2014-09-09 09:21 @431

Si está garantizado que lo que queremos cambiar está en una sola línea, podemos usar una simplificación para sacar lo que queremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. my $verbo = qr/\\(?:tcboxverb|myverb)/;
  6.  
  7. my $argumento_corchetes = qr/(?:\[.+?\])?/;
  8.  
  9. my $argumentos = qr/\{(.+)\}/;          # ATENCIÓN
  10.  
  11.  
  12. open my $latex, '<', 'code_37622_4.txt';
  13.  
  14. while (<$latex>) {
  15.  
  16.     if (m/$verbo$argumento_corchetes$argumentos/) {
  17.    
  18.         say $1;
  19.     }
  20. }
  21.  
  22. close $latex;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es posible hacer esto porque estamos dando por supuesto que no hay ninguna otra llave de cierre que las que forman parte de lo que buscamos. Si no es así, el problema es mucho más complicado, pero no imposible (ver sección "(?PARNO)" "(?-PARNO)" "(?+PARNO)" "(?R)" "(?0)" en perlre.pod).
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: Ajustar nueva regla a script

Notapor pablgonz » 2014-09-09 12:07 @546

En efecto, siempre irá en una línea. Mi idea era adaptarlo dentro del script que ya estaba usando, pues la idea es modificar esas palabras con el hash, es decir, si el texto de entrada era:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. Deseo modificar esto:
  2. \tcboxverb{\begin{pspicture} o \begin{pspicture*}} texto
  3. o esto
  4. texto \tcboxverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  5. o esto
  6. texto \myverb[colback=blue!10!white,colupper=blue]{\begin{pspicture} o \begin{pspicture*}} texto
  7. o esto
  8. texto \myverb{\begin{pspicture} o \begin{pspicture*}} texto
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

la salida esperada sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. Deseo modificar esto:
  2. \tcboxverb{\begin{PSPICTURE} o \begin{PSPICTURE*}} texto
  3. o esto
  4. texto \tcboxverb[colback=blue!10!white,colupper=blue]{\begin{PSPICTURE} o \begin{PSPICTURE*}} texto
  5. o esto
  6. texto \myverb[colback=blue!10!white,colupper=blue]{\begin{PSPICTURE} o \begin{PSPICTURE*}} texto
  7. o esto
  8. texto \myverb{\begin{PSPICTURE} o \begin{PSPICTURE*}} texto
Coloreado en 0.000 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)

Re: Ajustar nueva regla a script

Notapor pablgonz » 2014-09-14 20:14 @885

Ya lo logré. Al final me quedé con la idea de leer el archivo completo por líneas y agregar algo de código para hacer los cambios usando el mismo hash. Lo dejé así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $verbo = qr/\\(?:tcboxverb|myverb)/;
  2.  
  3. my $argumento_corchetes = qr/(?:\[.+?\])?/;
  4.  
  5. my $argumentos = qr/\{(.+)\}/;          # ATENCIÓN
  6. # lo leo completo
  7. my @lineas;
  8.     {
  9.         open my $FILE, "test.tex";
  10.         @lineas = <$FILE>;
  11.         close $FILE;
  12.     }
  13. # hacemos los cambios con el mismo hash
  14. for (@lineas) {
  15.     if (m/$verbo$argumento_corchetes$argumentos/) {
  16.         while (my($busco, $cambio) = each %cambios) {
  17.             s/\Q$busco\E/$cambio/g;
  18.         }
  19.     }
  20.     print;
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Saludos
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 6 invitados

cron