Как сохранить измененное дерево на диск с помощью XML Twig - PullRequest
3 голосов
/ 19 августа 2010

Попробовал это ниже, но я получаю файл 0 и эту ошибку. print () на неоткрытом дескрипторе файла в C: /Perl/site/lib/XML/Twig.pm строка 3036.

#!c:\perl\bin\perl.exe
use strict;
use XML::Twig;

my $upd_file = "updev.xml" ;
my $main_file = "main.xml" ;

# get the info we need by loading the update file
my $t_upd= new XML::Twig();

$t_upd->parsefile( $upd_file);

my $upd_dev_id = $t_upd->root->next_elt( 'DEVNUM')->text;
my $upd_dev    = $t_upd->root->next_elt( 'DEVS');
my $upd_seg    = $t_upd->root ;

# now process the main file
my $t= new XML::Twig( TwigHandlers => { DEVS => \&DEVS, },
              PrettyPrint => 'indented',
            );
$t->parsefile( $main_file);
$t->flush;           # don't forget or the last closing tags won't be printed

open( OUT, ">$main_file") or die "cannot open out file main_file:$!";

sub DEVS
  { my( $t, $DEVS)= @_;
    # just replace devs if the previous dev_id is the right one
    if( $DEVS->prev_elt( 'DEVNUM')->text eq $upd_dev_id) {
      $upd_dev->replace($DEVS);    
    }
     $t->flush(\*OUT) ;  # print and flush memory so only one dev is in there at once

  }

close OUT ;

1 Ответ

5 голосов
/ 01 сентября 2010

Вероятно, ваша проблема в том, что вы передали дескриптор файла, а не ссылку на дескриптор файла.

$t->flush(\*OUT) # look at the '\'

Некоторые предложения для вашего кода: в современном perl лучше использовать три аргумента open и косвенные дескрипторы файла:

open (my $fh_out, '>', $out_file) or die "unable to open '$out_file' for writing: $!";

$twig->print($fh_out); # this prints to the filehandle

Другой способ печати состоит в том, чтобы заштриховать дерево с помощью $twig->sprint и распечатать его как файл *, как обычно

 print {$fh_out} $twig->sprint();
...