• Publicidad

Uso del operador rango y reemplazo con hash

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

Uso del operador rango y reemplazo con hash

Notapor pablgonz » 2020-05-16 22:20 @972

Hola a todos.

Hace días que estoy tratando de resolver un problema con el uso de .. y un reemplazo usando hash. Trataré de explicarme de la manera más clara posible.

Intento modificar algunas palabras dentro un archivo LaTeX para extraerlas con una expresión regular, para que todo quede en forma y no extraiga contenido donde no debo, hago algunos cambios dentro de algunos entornos (verbatim y verbatim write). Los entornos donde deseo hacer los cambios siempre están emparejados (aunque estén anidados), es decir inician \begin{entorno} y terminan \end{entorno}. Los nombres de estos entornos los tengo guardados en un par de array, si está todo ordenado funciona bien, pero si se cruzan las palabras mi truco falla.

Para ser más preciso, este es mi código de ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.26;
  3. use Data::Dumper;
  4.  
  5. ### Entornos reservados
  6. my @reservados = qw (preview nopreview);
  7.  
  8. ### Entornos que deseo extraer por defecto
  9. my @extr_tmp = qw ( pspicture psgraph PSTexample);
  10.  
  11. ### Otros entornos que deseo extraer (pasado como argumento)
  12. my @otros = qw ( Otro );
  13.  
  14. push (@extr_tmp,@otros,@reservados); # los junto todos
  15.  
  16. my $entornos = join "|", map quotemeta, sort { length $a <=> length $b } @extr_tmp;
  17. $entornos = qr/$entornos/x;
  18. my $extraer = qr /
  19.                 (
  20.                     (?:
  21.                         \\begin\{$entornos\*?\}
  22.                       (?:
  23.                         (?>[^\\]+)|
  24.                         \\
  25.                         (?!begin\{$entornos\*?\})
  26.                         (?!end\{$entornos\*?\})|
  27.                         (?-1)
  28.                       )*
  29.                       \\end\{$entornos\*?\}
  30.                     )
  31.                 )
  32.                 /x;
  33.  
  34. ### Entornos verbatim que conozco
  35. my @verb_tmp = qw (verbatim Verbatim BVerbatim SaveVerbatim PSTcode);
  36. my $verbatim = join "|", map quotemeta, sort { length $a <=> length $b } @verb_tmp;
  37. $verbatim = qr/$verbatim/x;
  38.  
  39. ### Entornos verbatim write que conozco
  40. my @verbw_tmp = qw (scontents filecontents tcboutputlisting extikzpicture);
  41. my $verbatim_w = join "|", map quotemeta, sort { length $a <=> length $b } @verbw_tmp;
  42. $verbatim_w = qr/$verbatim_w/x;
  43.  
  44. ### Función para crear el hash begin -> BEGIN, end -> END
  45. sub crearhash {
  46.     my %cambios;
  47.     for my $aentra(@_){
  48.         for my $initend (qw(begin end)) {
  49.             $cambios{"\\$initend\{$aentra"} = "\\\U$initend\E\{$aentra";
  50.             }
  51.         }
  52.     return %cambios;
  53. }
  54.  
  55. ### Función para eliminar repetidos
  56. sub uniq {
  57.     my %seen;
  58.     grep !$seen{$_}++, @_;
  59. }
  60.  
  61. ### Función para restar
  62. sub array_minus(\@\@) {
  63.     my %e = map{ $_ => undef } @{$_[1]};
  64.     return grep( ! exists( $e{$_} ), @{$_[0]} );
  65. }
  66.  
  67. ### Array y hash para los cambios
  68. my %iniciofin = (
  69. # begin/end para verbatim write
  70.     '\begin{document}' => '\BEGIN{document}',
  71.     '\end{document}'   => '\END{document}',
  72.     );
  73.  
  74.  
  75.  
  76. my @noverbatimw; # tiene todo menos verbatim write
  77. push(@noverbatimw, @extr_tmp, @verb_tmp);
  78. @noverbatimw = uniq(@noverbatimw);
  79. my %reemplazo_en_write = crearhash(@noverbatimw);
  80. #print Dumper \%reemplazo_en_write; #__END__
  81.  
  82. my @noverbatim; # tiene todo menos verbatim
  83. push(@noverbatim, @extr_tmp, @verbw_tmp);
  84. @noverbatim = uniq(@noverbatim);
  85. my %reemplazo_en_normal = crearhash(@noverbatim);
  86. #print Dumper \%reemplazo_en_normal; #__END__
  87.  
  88. my $document = '
  89. \documentclass{article}
  90. % Usando filecontents
  91. \begin{filecontents*}{temp.tex}
  92. Aquí puede ir cualquier cosa escrita
  93. \begin{document}   % cambia
  94. \begin{Verbatim}   % cambia
  95. \end{preview}      % cambia
  96. \begin{preview}    % cambia
  97. \begin{PSTexample} % cambia
  98. \end{enumerate}
  99. \end{filecontents*} % cierra
  100.  
  101. \usepackage{tikz,fvextra}
  102. \begin{document}
  103.  
  104. Aquí inicia el documento real
  105.  
  106. \begin{Verbatim}
  107. Aquí va cualquier cosa
  108. \begin{filecontents*} % cambia
  109. \begin{enumerate}
  110.  \item First
  111.  \begin{enumerate}
  112.    \item Second
  113.    \item Third
  114.  \end{enumerate}
  115.  \item Fourth
  116. \end{enumerate}
  117. \end{Verbatim} % cierra
  118.  
  119. Aquí otro
  120. \begin{Verbatim}
  121. \end{filecontents*} % cambia
  122. Texto
  123. \end{Verbatim} % cierra
  124.  
  125. Texto \begin{verbatim}
  126. % Inicia
  127. \begin{document}     % cambia
  128. \begin{filecontents} % cambia
  129. \end{PSTexample}     % cambia
  130. \begin{preview}      % cambia
  131. % Termina
  132. \end{verbatim} % cierra
  133.  
  134. Este lo sacaré
  135. \begin{PSTexample}
  136. % Esto es example 1
  137. \pspicture(4,6)
  138. \psset{unit=2cm}
  139. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  140. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  141. \endpspicture
  142. \end{PSTexample}
  143.  
  144. Este también lo sacaré
  145. \begin{pspicture}(4,6)
  146. \psset{unit=2cm}
  147. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  148. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  149. \end{pspicture}
  150.  
  151. Esto No lo sacaré
  152. \begin{nopreview}
  153. \begin{verbatim}
  154. \begin{filecontents} % cambia
  155. \begin{preview}      % cambia
  156. \end{verbatim}
  157. \end{nopreview}
  158.  
  159. Más texto
  160. Esto igual lo sacaré
  161. XXX\begin{preview}
  162. \begin{verbatim}
  163. \begin{filecontents} % cambia
  164. \begin{preview}      % cambia
  165. \end{verbatim}
  166.  
  167. \end{preview}YYYY
  168. \end{document}
  169. ';
  170.  
  171. ### Divido por líneas y hacemos los cambios
  172. my @lineas = split /\n/, $document;
  173. my %replace = (%reemplazo_en_normal,%iniciofin);
  174. my $find    = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace;
  175. my $DEL;
  176. for (@lineas) {
  177.     if (/\\begin\{($verbatim\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) {
  178.         s/($find)/$replace{$1}/g;
  179.     }
  180.     if (/\\begin\{($verbatim_w\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) {
  181.          %replace = (%reemplazo_en_write,%iniciofin); #
  182.          $find    = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace;
  183.         s/($find)/$replace{$1}/g;
  184.     }
  185. }
  186.  
  187. ### Unimos y miramos
  188. $document = join("\n", @lineas);
  189. say $document;
  190.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
El cual genera esta salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. % Usando filecontents
  3. \begin{filecontents*}{temp.tex}
  4. Aquí puede ir cualquier cosa escrita
  5. \BEGIN{document}   % cambia
  6. \BEGIN{Verbatim}   % cambia
  7. \END{preview}      % cambia
  8. \BEGIN{preview}    % cambia
  9. \BEGIN{PSTexample} % cambia
  10. \end{enumerate}
  11. \end{filecontents*} % cierra
  12.  
  13. \usepackage{tikz,fvextra}
  14. \BEGIN{document}
  15.  
  16. Aquí inicia el documento real
  17.  
  18. \BEGIN{Verbatim}
  19. Aquí va cualquier cosa
  20. \begin{filecontents*} % cambia
  21. \begin{enumerate}
  22.   \item First
  23.   \begin{enumerate}
  24.     \item Second
  25.     \item Third
  26.   \end{enumerate}
  27.   \item Fourth
  28. \end{enumerate}
  29. \END{Verbatim} % cierra
  30.  
  31. Aquí otro
  32. \BEGIN{Verbatim}
  33. \end{filecontents*} % cambia
  34. Texto
  35. \END{Verbatim} % cierra
  36.  
  37. Texto \BEGIN{verbatim}
  38. % Inicia
  39. \BEGIN{document}     % cambia
  40. \begin{filecontents} % cambia
  41. \END{PSTexample}     % cambia
  42. \BEGIN{preview}      % cambia
  43. % Termina
  44. \END{verbatim} % cierra
  45.  
  46. Este lo sacaré
  47. \BEGIN{PSTexample}
  48. % Esto es example 1
  49. \pspicture(4,6)
  50. \psset{unit=2cm}
  51. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  52. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  53. \endpspicture
  54. \END{PSTexample}
  55.  
  56. Este también lo sacaré
  57. \BEGIN{pspicture}(4,6)
  58. \psset{unit=2cm}
  59. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  60. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  61. \END{pspicture}
  62.  
  63. Esto No lo sacaré
  64. \BEGIN{nopreview}
  65. \BEGIN{verbatim}
  66. \begin{filecontents} % cambia
  67. \BEGIN{preview}      % cambia
  68. \END{verbatim}
  69. \END{nopreview}
  70.  
  71. Más texto
  72. Esto igual lo sacaré
  73. XXX\BEGIN{preview}
  74. \BEGIN{verbatim}
  75. \begin{filecontents} % cambia
  76. \BEGIN{preview}      % cambia
  77. \END{verbatim}
  78.  
  79. \END{preview}YYYY
  80. \END{document}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Pero, yo espero que sea algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. % Usando filecontents
  3. \begin{filecontents*}{temp.tex}
  4. Aquí puede ir cualquier cosa escrita
  5. \BEGIN{document}   % cambia
  6. \BEGIN{Verbatim}   % cambia
  7. \END{preview}      % cambia
  8. \BEGIN{preview}    % cambia
  9. \BEGIN{PSTexample} % cambia
  10. \end{enumerate}
  11. \end{filecontents*} % cierra
  12.  
  13. \usepackage{tikz,fvextra}
  14. \begin{document}
  15.  
  16. Aquí inicia el documento real
  17.  
  18. \begin{Verbatim}
  19. Aquí va cualquier cosa
  20. \BEGIN{filecontents*} % cambia
  21. \begin{enumerate}
  22.   \item First
  23.   \begin{enumerate}
  24.     \item Second
  25.     \item Third
  26.   \end{enumerate}
  27.   \item Fourth
  28. \end{enumerate}
  29. \end{Verbatim} % cierra
  30.  
  31. Aquí otro
  32. \begin{Verbatim}
  33. \END{filecontents*} % cambia
  34. Texto
  35. \end{Verbatim} % cierra
  36.  
  37. Texto \begin{verbatim}
  38. % Inicia
  39. \BEGIN{document}     % cambia
  40. \BEGIN{filecontents} % cambia
  41. \END{PSTexample}     % cambia
  42. \BEGIN{preview}      % cambia
  43. % Termina
  44. \end{verbatim} % cierra
  45.  
  46. Este lo sacaré
  47. \begin{PSTexample}
  48. % Esto es example 1
  49. \pspicture(4,6)
  50. \psset{unit=2cm}
  51. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  52. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  53. \endpspicture
  54. \end{PSTexample}
  55.  
  56. Este tambien lo sacaré
  57. \begin{pspicture}(4,6)
  58. \psset{unit=2cm}
  59. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  60. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  61. \end{pspicture}
  62.  
  63. Esto No lo sacaré
  64. \begin{nopreview}
  65. \begin{verbatim}
  66. \BEGIN{filecontents} % cambia
  67. \BEGIN{preview}      % cambia
  68. \end{verbatim}
  69. \end{nopreview}
  70.  
  71. Más texto
  72. Esto igual lo sacaré
  73. XXX\begin{preview}
  74. \begin{verbatim}
  75. \BEGIN{filecontents} % cambia
  76. \BEGIN{preview}      % cambia
  77. \end{verbatim}
  78.  
  79. \end{preview}YYYY
  80. \end{document}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
El operador rango .. hace lo correcto, ejecuta los cambios, pero no obtengo el resultado esperado. Después de mirar bien el asunto, asumo que el problema es porque tengo palabras cruzadas entre un entorno y otro, lo cual hace que el reemplazo no sea el correcto.

No sé cómo hacer que lea el archivo y decida cuál cambio se debe efectuar primero o quizás una mejor forma de hacer esto.

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

Publicidad

Re: Uso del operador rango y reemplazo con hash

Notapor pablgonz » 2020-05-18 12:07 @547

Tengo una idea que quizás sirva de algo.

Sé que los entornos deben aparecer en líneas distintas y son disjuntos (es verbatim o verbatim write, pero no ambos), así que puedo saber con cual empezar: bastaría con capturar el número de línea en el cual hace la primera aparición en el archivo y guardarlo, algo como:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $vwNolinea; # verbatim write
  2. my $vsNolinea; # verbatim normal
  3.  
  4. if ($document =~ /\\begin\{$verbatim_w\*?\}.+?/ms) {
  5.   # Añadimos 1 a la primera línea y la guardamos
  6.   $vwNolinea = 1 + substr($document, 0, $-[0]) =~ tr/\n//;
  7.   #say $vwNolinea;
  8. }
  9.  
  10. if ($document =~ /\\begin\{$verbatim\*?\}.+?/ms) {
  11.   # Añadimos 1 a la primera línea y la guardamos
  12.   $vsNolinea = 1 + substr($document, 0, $-[0]) =~ tr/\n//;
  13.   #say $vsNolinea;
  14. }
  15.  
  16. ### Divido por líneas y hacemos los cambios
  17. my @lineas = split /\n/, $document;
  18. my %replace = (%reemplazo_en_normal,%iniciofin);
  19. my $find    = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace;
  20. my $DEL;
  21.  
  22. if ($vwNolinea < $vsNolinea) {
  23.     say "Verbatim write está primero";
  24.     for (@lineas) {
  25.         if (/\\begin\{($verbatim_w\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) {
  26.             %replace = (%reemplazo_en_write,%iniciofin);
  27.             $find    = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace;
  28.             s/($find)/$replace{$1}/g;
  29.         }
  30.         last if (/\\begin\{$verbatim\*?\}/);
  31.     }
  32. }
  33.  
  34. ### Unimos y miramos
  35. $document = join("\n", @lineas);
  36. say $document;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
y hacer que salte si la línea que encuentra es \\begin\{$verbatim\*?\} hasta que ésta cierre (\\end\{$verbatim\*?\}) y luego volver a empezar. last if no es lo correcto (creo que redo es lo que busco), seguiré intentando :)
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Uso del operador rango y reemplazo con hash

Notapor pablgonz » 2020-05-20 07:48 @367

Creo que he dado con la solución, al parecer mi primer enfoque usando for y el operador rango no eran las herramientas adecuadas para esto. Cambiando a while y con un par de expresiones regulares ya obtengo la salida que buscaba. El código quedó así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.26;
  3. use Data::Dumper;
  4.  
  5. ### Función para crear el hash begin -> BEGIN, end -> END
  6. sub crearhash {
  7.     my %cambios;
  8.     for my $aentra(@_){
  9.         for my $initend (qw(begin end)) {
  10.             $cambios{"\\$initend\{$aentra"} = "\\\U$initend\E\{$aentra";
  11.             }
  12.         }
  13.     return %cambios;
  14. }
  15.  
  16. ### Función para eliminar repetidos
  17. sub uniq {
  18.     my %seen;
  19.     return grep !$seen{$_}++, @_;
  20. }
  21.  
  22. ### Función para restar
  23. sub array_minus(\@\@) {
  24.     my %e = map{ $_ => undef } @{$_[1]};
  25.     return grep ! exists( $e{$_} ), @{$_[0]} ;
  26. }
  27.  
  28. ### Entornos reservados
  29. my @reservados = qw (preview nopreview);
  30.  
  31. ### Entornos que deseo extraer por defecto
  32. my @extr_tmp = qw ( pspicture psgraph PSTexample);
  33.  
  34. ### Otros entornos que deseo extraer (pasado como argumento al script)
  35. my @otros = qw ( Otros );
  36.  
  37. push @extr_tmp,@reservados,@otros; # los junto todos
  38. @extr_tmp = uniq(@extr_tmp);
  39.  
  40. my $entornos = join q{|}, map {quotemeta} sort { length $a <=> length $b } @extr_tmp;
  41. $entornos = qr/$entornos/x;
  42. my $extraer = qr {
  43.                    (
  44.                     (?:
  45.                         \\begin\{$entornos\*?\}
  46.                       (?:
  47.                         (?>[^\\]+)|
  48.                         \\
  49.                         (?!begin\{$entornos\*?\})
  50.                         (?!end\{$entornos\*?\})|
  51.                         (?-1)
  52.                       )*
  53.                       \\end\{$entornos\*?\}
  54.                     )
  55.                    )
  56.                  }x;
  57.  
  58. ### Entornos verbatim que conozco
  59. my @verb_tmp = qw (verbatim Verbatim BVerbatim SaveVerbatim PSTcode);
  60.  
  61. ### Entornos verbatim write que conozco
  62. my @verbw_tmp = qw (scontents filecontents tcboutputlisting extikzpicture);
  63.  
  64. ### Hash para algunos cambios
  65. my %iniciofin = (
  66. # begin/end para verbatim write
  67.     '\begin{document}' => '\BEGIN{document}',
  68.     '\end{document}'   => '\END{document}',
  69.     );
  70.  
  71. my @noverbatimw; # tiene todo menos verbatim write
  72. push @noverbatimw, @extr_tmp, @verb_tmp;
  73. @noverbatimw = uniq(@noverbatimw);
  74. my %reemplazo_en_write = crearhash(@noverbatimw);
  75.  
  76. my @noverbatim; # tiene todo menos verbatim normal
  77. push @noverbatim, @extr_tmp, @verbw_tmp;
  78. @noverbatim = uniq(@noverbatim);
  79. my %reemplazo_en_normal = crearhash(@noverbatim);
  80.  
  81. my $document = '\documentclass{article}
  82. % Usando filecontents
  83. \begin{filecontents*}{temp.tex}
  84. Aquí puede ir cualquier cosa escrita
  85. \begin{document}   % cambia
  86. \begin{Verbatim}   % cambia
  87. \end{preview}      % cambia
  88. \begin{preview}    % cambia
  89. \begin{PSTexample} % cambia
  90. \end{enumerate}
  91. \end{filecontents*} % cierra
  92.  
  93. \usepackage{tikz,fvextra}
  94. \begin{document}
  95.  
  96. Aquí inicia el documento real
  97.  
  98. \begin{Verbatim}
  99. Aquí va cualquier cosa
  100. \begin{filecontents*} % cambia
  101. \begin{enumerate}
  102. \item First
  103. \begin{enumerate}
  104.   \item Second
  105.   \item Third
  106. \end{enumerate}
  107. \item Fourth
  108. \end{enumerate}
  109. \end{Verbatim} % cierra
  110.  
  111. Aquí otro
  112. \begin{Verbatim}
  113. \end{filecontents*} % cambia
  114. Texto
  115. \end{Verbatim} % cierra
  116.  
  117. Texto \begin{verbatim}
  118. % Inicia
  119. \begin{document}     % cambia
  120. \begin{filecontents} % cambia
  121. \end{PSTexample}     % cambia
  122. \begin{preview}      % cambia
  123. % Termina
  124. \end{verbatim} % cierra
  125.  
  126. Este lo sacaré
  127. \begin{PSTexample}
  128. % Esto es example 1
  129. \pspicture(4,6)
  130. \psset{unit=2cm}
  131. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  132. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  133. \endpspicture
  134. \end{PSTexample}
  135.  
  136. Este también lo sacaré
  137. \begin{pspicture}(4,6)
  138. \psset{unit=2cm}
  139. \pslineByHand[linecolor=red](0,0)(0,2)(2,2)
  140. (2,0)(0,0)(2,2)(1,3)(0,2)(2,0)
  141. \end{pspicture}
  142.  
  143. Esto No lo sacaré
  144. \begin{nopreview}
  145. \begin{verbatim}
  146. \begin{filecontents} % cambia
  147. \begin{preview}      % cambia
  148. \end{verbatim}
  149. \end{nopreview}
  150.  
  151. Más texto
  152. Esto igual lo sacaré
  153. XXX\begin{preview}
  154. \begin{verbatim}
  155. \begin{filecontents} % cambia
  156. \begin{preview}      % cambia
  157. \end{verbatim}
  158.  
  159. \end{preview}YYYY
  160. \end{document}
  161. ';
  162.  
  163. ### Creamos un par de expresiones regulares para verbatim y verbatim write
  164. my $verbatim = join q{|}, map {quotemeta} sort { length $a <=> length $b } @verb_tmp;
  165. $verbatim = qr/$verbatim/x;
  166. my $verb_std = qr {
  167.                 (
  168.                     (?:
  169.                         \\begin\{$verbatim\*?\}
  170.                       (?:
  171.                         (?>[^\\]+)|
  172.                         \\
  173.                         (?!begin\{$verbatim\*?\})
  174.                         (?!end\{$verbatim\*?\})|
  175.                         (?-1)
  176.                       )*
  177.                       \\end\{$verbatim\*?\}
  178.                     )
  179.                 )
  180.                 }x;
  181.  
  182. my $verbatim_w = join q{|}, map {quotemeta} sort { length $a <=> length $b } @verbw_tmp;
  183. $verbatim_w = qr/$verbatim_w/x;
  184. my $verb_wrt = qr {
  185.                 (
  186.                     (?:
  187.                         \\begin\{$verbatim_w\*?\}
  188.                       (?:
  189.                         (?>[^\\]+)|
  190.                         \\
  191.                         (?!begin\{$verbatim_w\*?\})
  192.                         (?!end\{$verbatim_w\*?\})|
  193.                         (?-1)
  194.                       )*
  195.                       \\end\{$verbatim_w\*?\}
  196.                     )
  197.                 )
  198.                 }x;
  199.  
  200. ### Cambios usando hash
  201. my %replace = (%reemplazo_en_write,%iniciofin);
  202. my $find    = join q{|}, map {quotemeta} sort { length $a <=> length $b } keys %replace;
  203.  
  204. ### Recorremos línea a línea y hacemos los cambios (/p para ${^MATCH})
  205. while ($document =~ /$verb_wrt | $verb_std /pgmx) {
  206.     my ($pos_inicial, $pos_final) = ($-[0], $+[0]);
  207.     my $encontrado = ${^MATCH};
  208.     if ($encontrado =~ /$verb_wrt/) {
  209.         $encontrado =~ s/($find)/$replace{$1}/g;
  210.         substr $document, $pos_inicial, $pos_final-$pos_inicial, $encontrado;
  211.         pos ($document) = $pos_inicial + length $encontrado;
  212.     }
  213.     if ($encontrado =~ /$verb_std/) {
  214.         %replace = (%reemplazo_en_normal,%iniciofin);
  215.         $find    = join q{|}, map {quotemeta} sort { length $a <=> length $b } keys %replace;
  216.         $encontrado =~ s/($find)/$replace{$1}/g;
  217.         substr $document, $pos_inicial, $pos_final-$pos_inicial, $encontrado;
  218.         pos ($document) = $pos_inicial + length $encontrado;
  219.     }
  220. }
  221.  
  222. say $document;
  223.  
  224. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
No se si el código está del todo correcto, pero, cumple su función :)
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 1 invitado