in reply to Recursive substitution difficulties
s{(<value>|\G)(.+?)\|(.+?)\|(.*?)(?=</value>)} {$1$2</value><name>$3</name><value>$4}sg;
What it should match for each pass of /g:
Pass 1: <name>(test)</name><value>(431)| Pass 2: (alpha)|(123)| Pass 3: (bravo)|(542)| Pass 4: (charlie)|(412)</value>
What it does match for each pass of /g:
Pass 1: <value>(431)|(alpha|123|bravo|542|charlie|412)
Fix:
s{(?:<name>(.*?)</name><value>|\G([^|]*?)\|)([^|]*?)(?:\||</value>)}{ "<name>" . (defined($1)?$1:$2) . "</name><value>$3</value>" }seg;
A much more robust fix:
s{<name>(.*?)</name><value>(.*?)</value>}{ my $s = "|$1|$2"; $s =~ s{\|([^|]*)\|([^|]*)}{<name>$1</name><value>$2</value>}sg; $s }seg;
|
|---|