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 bazbar baz
块:bar bazbar baz
解析后:bar baz
因此,我正在修改
foo
处理程序内部的细枝,更改会停留在block
处理程序中以查看它,但当处理完成后,更改就会消失。这是怎么回事?我怎样才能使我的零钱在树枝的生命周期中保持不变?你什么也不退。删除子例程中的打印语句,您将获得以下输出:
after parse: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>
解析后:bar bazbar 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?今晚对我来说有点晚了,明天早上怎么样?