Estoy trabajando con archivos .xml y necesitaba hacer una modificación específica. Mi texto de entrada tiene el siguiente formato:
Using xml Syntax Highlighting
- <p t="opener">
- <w id="23">
- <o>Hola</o>
- </w>
- <w id="24">
- <o>mundo</o>
- </w>
- </p>
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Es decir, cada palabra de un texto está delimitada por la etiqueta <o></o> y además lleva una numeración correlativa que no empieza en 1. Esta numeración aparece como valor del atributo id dentro de la etiqueta <w></w>. Finalmente, hay un nivel superior <p></p> que engloba párrafos enteros.
La salida que necesito tendría el siguiente formato:
Using xml Syntax Highlighting
- <p t="opener">
- <w id="1">
- <o>Hola</o>
- </w>
- <w id="2">
- <o>mundo</o>
- </w>
- </p>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Es decir, lo mismo que el anterior pero haciendo que la numeración correlativa comience en 1.
Creo que la solución sería usar el operador de autoincremento (++), pero la cosa se complica, porque necesitaba aplicar esa numeración desde 1 solo si la sección de párrafo lleva el atributo "opener" (como en la entrada anterior). Es decir, lo que no sé hacer en Perl es crear una condición tal que imprima la salida deseada con la numeración desde 1 solo a determinadas secciones de texto (por ejemplo, aquellas que están delimitadas por un <p></p> cuyo atributo es "opener").
Mi propuesta:
Using perl Syntax Highlighting
- use warnings;
- use strict;
- $/ = undef
- my $numeración = 0;
- my $autoincremento = $numeración++;
- my $filename = shift;
- open F, $filename or die "Usa: $0 FILENAME\n";
- while(<F>) {
- if (/<p t=\"opener\".*?<\/p>/s) { #Si encuentras la sección <p t="opener"></p> (el punto (.) equivale a cualquier caracter incluyendo cambio de línea)
- s/<w id=\".*?\"/<w id=\"$autoincremento\"/ge #sustituye el valor de id por la variable $autoincremento
- }
- }
- close F;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Soy consciente de que en realidad no le estoy diciendo a Perl que aplique la sustitución solo en la sección deseada, simplemente le estoy diciendo que aplique esa sustitución a todo el documento si la condición es verdadera.
¿Alguna sugerencia que me permita aplicar la restricción y depurar mi propuesta?
Gracias.