3

文字列が出力に2回表示されるのはなぜですか?

#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;


my $string = '<cd_catalogue><title>Hello, World!</title></cd_catalogue>';

my $t= XML::Twig->new(  twig_handlers   => { cd_catalogue => \&cd_catalogue, },
            pretty_print => 'indented', 
);

$t->parse( $string );


sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->flush;
}


# Output:
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>
4

2 に答える 2

4

print使用するようにサブを変更し、問題を回避するpurge代わりにflush

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->print;
    $cd_catalogue->purge;
}

はルートノードflushであるため、例が単純であるために混乱しています。cd_catalogueデータを次のようなものに変更した場合:

my $string = '
    <cds>
        <cd_catalogue><title>Hello, World!</title></cd_catalogue>
    </cds>';

または、twig_handlerを変更して検索した場合title

twig_handlers    => { title => \&cd_catalogue }

次に、それがあなたので期待どおりに機能することがわかり$cd_catalogue->flushます$string

/ I3az /

于 2010-01-07T09:41:26.533 に答える
4

プログラムでXML::Twigが正しく使用されていません。ドキュメントによると、「要素ではなく、常に小枝を洗い流す」必要があります。

cd_catalogueに変更

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $t->flush;
}

期待される動作を取得します。

于 2010-01-07T10:40:30.723 に答える