如何阻止此Perl命令一遍又一遍地打印XML声明?

NEX*_*NEX 2 linux perl

我在Red Hat Linux中运行以下命令:

perl -ne '
    print "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    while(/(<PRINTKIT FORM_ID=\"PP_WELCOMEKIT\">.*?<\/PRINTKIT>)/g){
        print "<sf><XDF>$1</XDF></sf>"
    };
' $1 > $2.$TS2.postscrub
Run Code Online (Sandbox Code Playgroud)

$2是一个文件名,$TS2只是一个日期.

目前它打印出100行

<?xml version=\"1.0\" encoding=\"utf-8\"?>
Run Code Online (Sandbox Code Playgroud)

当我真的不想让它打印任何一个.

有人可以更改上面的代码来做它正在做的一切,除了不再打印<?xml version=\"1.0\" encoding=\"utf-8\"?>了吗?我已经尝试过删除带有该行的print语句,如下所示:

perl -ne '
    while(/(<PRINTKIT FORM_ID=\"PP_WELCOMEKIT\">.*?<\/PRINTKIT>)/g){ 
        print "<sf><XDF>$1</XDF></sf>"
    };
' $1 > $2.$TS2.postscrub
Run Code Online (Sandbox Code Playgroud)

这样做会使它输出一个0字节的文件,所以我知道它不起作用.

Sob*_*que 7

真的 - 请不要使用正则表达式进行操作XML.这是非常令人讨厌的,正如你所发现的那样 - 容易被莫名其妙地打破.

尝试这样的事情(我猜测了你的样本数据).

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

sub replace_printkit {
    my ( $twig, $pk ) = @_;
    my $sf = $twig->root->insert_new_elt('sf');
    $sf->insert_new_elt( 'XDF', $pk->trimmed_text );
    $pk->delete;
}

my $twig = XML::Twig->new(
    'pretty_print'  => 'indented',
    'twig_handlers' => { 'PRINTKIT' => \&replace_printkit }
);

$twig->parse( \*DATA );
$twig->set_xml_version('1.0');
$twig->set_encoding('utf-8');
$twig->print;


__DATA__
<xml>
  <PRINTKIT FORM_ID="PP_WELCOMEKIT">some_stuff_here</PRINTKIT>
</xml>
Run Code Online (Sandbox Code Playgroud)

这打印:

<?xml version="1.0" encoding="utf-8"?>
<xml>
  <sf>
    <XDF>some_stuff_here</XDF>
  </sf>
</xml>
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微修改它以输入数据.

编辑:

当你使用$ twig-> print时,我可以把它放到一个文件中吗?如果是这样,命令是什么?

open ( my $output_fh, '>', "new_file.xml" ) or die $!;
print {$output_fh} $twig -> sprint;
close ( $output_fh );
Run Code Online (Sandbox Code Playgroud)