XML::树枝更改已删除

XML::树枝更改已删除,xml,perl,xml-twig,Xml,Perl,Xml Twig,下面的程序给了我无法解释的奇怪输出: use strict; use warnings; use XML::Twig; my $xml = q{<block> <foo>bar baz</foo> </block>}; my $twig = XML::Twig->new( TwigHandlers => {foo => \&foo, block => \&block},

下面的程序给了我无法解释的奇怪输出:

use strict;
use warnings;
use XML::Twig;

my $xml = 
q{<block>
    <foo>bar baz</foo>
</block>};

my $twig = XML::Twig->new(
        TwigHandlers => {foo => \&foo, block => \&block},
    );

print "after parse: " . $twig->parse($xml)->sprint;


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

    my $text = $foo->sprint("don't print outside element");
    my $newSummary = XML::Twig::Elt->parse( '<p><i>' . $text . '</i></p>' );
    $newSummary->paste( 'before', $foo);
    my $parent = $foo->parent;
    # $foo->delete;
    print "foo: " . $parent->sprint . "\n\n";
}

sub block {
    my ($twig, $block) = @_;
    print "block: " . $block->sprint . "\n\n";
}
使用严格;
使用警告;
使用XML::Twig;
我的$xml=
q{
巴兹酒吧
};
my$twig=XML::twig->new(
TwigHandlers=>{foo=>\&foo,block=>\&block},
);
打印“解析后:”$twig->parse($xml)->sprint;
sub-foo{
我的($twig,$foo)=@;
我的$text=$foo->sprint(“不打印外部元素”);
my$newSummary=XML::Twig::Elt->parse(“”.$text.

”); $newSummary->paste('before',$foo); my$parent=$foo->parent; #$foo->delete; 打印“foo:”.$parent->sprint.\n\n”; } 子块{ 我的($twig,$block)=@; 打印“block:”.$block->sprint.\n\n”; }
它打印以下内容:

foo: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>

block: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>

after parse: <block><foo>bar baz</foo></block>
foo:bar baz

bar baz 块:bar baz

bar baz 解析后:bar baz

因此,我正在修改
foo
处理程序内部的细枝,更改会停留在
block
处理程序中以查看它,但当处理完成后,更改就会消失。这是怎么回事?我怎样才能使我的零钱在树枝的生命周期中保持不变?

你什么也不退。删除子例程中的打印语句,您将获得以下输出:

after parse: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>
解析后:bar baz

bar baz
这看起来像是一个bug,或者至少是一个作用域问题:当解析完成时,新元素似乎被垃圾收集

避免这种情况的一种方法是在元素的创建中添加一个
copy

my $newSummary = XML::Twig::Elt->parse( '<p><i>' . $text . '</i></p>' )->copy;
my$newSummary=XML::Twig::Elt->parse(“”.$text.

”)->复制;
删除
print
s对我来说没有任何改变,因为这是对象销毁中的一个bug,在这里的开发版本中已修复:或在github上:谢谢!如果我确定这是一个bug,我就会把它提交给你。你认为你什么时候会向CPAN发布3.42?今晚对我来说有点晚了,明天早上怎么样?