in reply to Recursive substitution difficulties

Your pattern with less leaning toothpicks (removed needless escapes of "<" and ">", and used an alternate delimiter to avoid escaping "/"):
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;