为什么XML::Twig会将提取的字符串输出两次?

为什么XML::Twig会将提取的字符串输出两次?,xml,perl,xml-twig,Xml,Perl,Xml Twig,为什么要在输出中两次获取字符串 #!/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 => \&

为什么要在输出中两次获取字符串

#!/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>
#/usr/bin/perl
使用警告;
严格使用;
使用XML::Twig;
我的$string='你好,世界!';
my$t=XML::Twig->new(Twig\u处理程序=>{cd\u目录=>\&cd\u目录,},
漂亮的打印=>“缩进”,
);
$t->parse($string);
子目录{
我的($t,$cd_目录)=@;
$cd_目录->刷新;
}
#输出:
#
#你好,世界!
#
#
#你好,世界!
#

将您的sub更改为使用
打印
清除
而不是
清除
可以解决问题:

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->print;
    $cd_catalogue->purge;
}
由于示例的简单性,
flush
变得混乱,因为
cd\u目录
是根节点。如果您将数据更改为以下内容:

my $string = '
    <cds>
        <cd_catalogue><title>Hello, World!</title></cd_catalogue>
    </cds>';
然后,您会发现
$cd\u catalog->flush
现在与您的
$string
一样工作


/I3az/

您的程序不正确地使用了XML::Twig,你应该“总是冲洗树枝,而不是元素。”

将cd_目录更改为

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

获得预期的行为。

奇怪的是,这是我最初在回答中提出的:)但是文档中确实说明并提供了使用“元素”(elements)刷新的示例。是的,元素上的刷新刷新到该元素,我将修复文档。谢谢
sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $t->flush;
}