AhmedABdo has asked for the wisdom of the Perl Monks concerning the following question:

I am using XML:twig to extract some attributes from an XML file using Perl;
Here is my code:
use XML::Twig; my $file = $ARGV[0]; $file =~ /(.+)\.xml/; my $outfile = $1.".snp" ; open my $out,'>',$outfile or die "Could not open file '$outfile' $!"; my $twig = XML::Twig->new ( twig_handlers => { 'Rs/MergeHistory' => \&MergeHistory, } ); $twig -> parsefile( "$file"); sub MergeHistory { my ($twig, $elt) = @_; print $out "\t"; print $out "rs"; print $out $elt->att('rsId'), ","; print $out "b"; print $out $elt->att('buildId'), ","; }
This print the following results:

rs56546490,b130,    rs386588736,b142
rs56546490,b130,    rs386588736,b142

What I want is to print each MergeHistory rsId and buildId together as the following:

rs56546490,rs386588736,   b130,b142
rs56546490,rs386588736,   b130,b142

Here is a part of the XML file which contains on two MergeHistory tags :

<Rs>
<MergeHistory rsId="56546490" buildId="130">
<MergeHistory rsId="386588736" buildId="142">
</Rs>
<Rs>
<MergeHistory rsId="56546490" buildId="130">
<MergeHistory rsId="386588736" buildId="142">
</Rs>

Replies are listed 'Best First'.
Re: Print attributes from two tags together
by Anonymous Monk on Sep 21, 2015 at 21:53 UTC

    What I want is to print each MergeHistory rsId and buildId together as the following:

    What has to happen for you to be able to do that?

    You have to keep a stack of rsids and buildids

    so

    my @rsids; my @buildids; my $twig = ... 'Rs/MergeHistory' => sub { my $rsid = ...; my $buid = ...; push @rsids, $rsid; push @buildids, $buid; }, ... print $out join(',',@rsids), "\t",join(',',@buildids), "\n";

    or

    my @merges; my $twig = ... 'Rs/MergeHistory' => sub { my $rsid = ...; my $buid = ...; push @merges, [ $rsid, $buid ]; }, ... print $out join(',', map { $_->[0] } @merges ), "\t",join(',',map { $_->[1] } @merges ), "\n";
      Thanks for your answer, but what does these dots means?
        That's the famous "exercise for the reader", they are the blanks where you have to fill in (e.g. parts from your original code). Other people might call it the homework he assigned to you ;-)

        Update: see also perlsyn