in reply to Re: Recursive substitution difficulties
in thread Recursive substitution difficulties

My earlier solution can easily be adapted:
s{\t([^\t]+)\t}{ my $s = "|$1"; $s =~ s{\|([^|]*)\|([^|]*)}{<name>$1</name><value>$2</value>}sg; $s }eg;

Replies are listed 'Best First'.
Re^3: Recursive substitution difficulties
by wx27 (Initiate) on Mar 15, 2010 at 22:21 UTC

    Thanks. That looks pretty straightforward. Is it possible to use that all on a command line invocation? Right now I have something like:

    perl -pe "s/^(.*?)\t(.*?)\|(.*?)\t(.*?)(?=\n)/<wrapper1>$1</wrapper1>< +wrapper2>$2\|$3</wrapper2><wrapper3>$4</wrapper3>/g;" inputfile
    and then a follow-up to expand wrapper2 and the delimited fields within.

      I was humouring your weird way of doing things, but it doesn't scale. Split the input into fields, edit the fields you want

      perl -lape' $F[1] =~ s{\|([^|]*)\|([^|]*)}{<name>$1</name><value>$2</value>}; $F[2] =~ s{\|([^|]*)\|([^|]*)}{<foo>$1</foo><bar>$2</bar>}; $_ = join("\t", @F); ' inputfile
        Thanks for your help. I will look to integrate the solutions you provided and see what is the best way to get from point A to point B (tab-delimited with some variable-length pipe-delimited subfields to XML).