2

以下のプログラムは、私が説明できない奇妙な出力を私に与えます:

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";
}

次のように出力されます。

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ハンドラー内の小枝を変更しているので、blockハンドラーがそれを確認できるように変更が残っていますが、処理がすべて完了すると、変更はなくなります。ここで何が起こっているのですか?小枝の寿命の間、変更を固定するにはどうすればよいですか?

4

2 に答える 2

4

バグ、または少なくともスコーピングの問題のように見えます。解析が終了すると、新しい要素はガベージコレクションされたようです。

これを回避する1つの方法copyは、要素の作成にを追加することです。

my $newSummary = XML::Twig::Elt->parse( '<p><i>' . $text . '</i></p>' )->copy;
于 2012-11-07T07:59:45.253 に答える
1

あなたは何も返していません。サブルーチンのprintステートメントを削除すると、次の出力が得られます。

after parse: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>
于 2012-11-07T07:31:44.743 に答える