両方のラベルのプロパティを一緒に印刷

両方のラベルのプロパティを一緒に印刷

私はXML:twigXMLファイルからいくつかの属性を抽出するためにPerlを使用しています。

これは私のコードです。

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'), ",";
    }

これにより、次の結果が印刷されます。

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

私が望むのは、次のように各合計をMergeHistory rsId一緒に印刷することですbuildId

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

以下はXMLファイルの一部です。

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

答え1

これ:

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,
    }
);

# Here starts changed code.

my %output = ( "rs", (),
             "b" , () );

$twig -> parsefile( "$file" );

my $inLine = 2;  # You said You want 2 in one line.

while( @{$output{"rs"}} ) {
    for( my $i=0; $i < $inLine; $i++ ) {
        print "rs" . ( shift @{$output{"rs"}} ) . ",";
    }
    print "\t";
    for( my $i=0; $i < $inLine; $i++ ) {
        print "b" . ( shift @{$output{"b"}} )  . ( $i == $inLine-1 ? "" : "," );
    }
}

print "\n";




sub MergeHistory
    {
        my ($twig, $elt) = @_;

        push @{$output{"rs"}}, ( "rs" . $elt->att('rsId') );
        push @{$output{"b"}},  ( "b" . $elt->att('buildId') );
    }

以下を印刷します。

rs56546490,rs386588736,   b130,b142

関連情報