XML::Twig - Редактирование на месте

Я пытаюсь добавить метку времени в конце файла xdp. Я использую XML:: Twig. При запуске сценария отметка времени (<testing>4619314911532861</testing>) добавляется в конце, но вывод поступает на STDOUT вместо testdata.xdp, Что мне не хватает?

Код:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;

my $twig=XML::Twig->new(pretty_print => 'indented');
my $file = 'testdata.xdp';
$twig->parsefile_inplace($file, '.bak');
my $root= $twig->root;
my @children= $root->children;

foreach my $child (@children){
    my $eblg= new XML::Twig::Elt( 'testing', localtime);
    $eblg->paste( 'last_child', $child);
}

$twig->flush; 

1 ответ

Решение

Проблема здесь - parsefile_inplace работает как отдельная вещь. Он заменяет исходный файл сразу после parse операция завершена.

Таким образом, чтобы использовать его таким образом, вы должны выполнять свою "работу" в twig_handlers, Если вы сделаете это, он будет анализировать / изменять / перезаписывать.

Например:

sub insert_after_all {
    my ( $twig, $element ) = @_;
    my $eblg= new XML::Twig::Elt( 'testing', localtime);
    $eblg->paste( 'last_child', $element);
    $twig -> flush;
}

my $twig =  XML::Twig->new(pretty_print => 'indented', 
                      twig_handlers => { '_all_' => \&insert_after_all } );
 my $file = 'testdata.xdp';
 $twig->parsefile_inplace($file, '.bak');

В противном случае - переименуйте источник, и print {$new_fh} $twig -> sprint;

Другие вопросы по тегам