如何用perl拆分xml文件?

时间:2016-08-26 17:32:26

标签: xml perl

我的代码

use strict;

use warnings;

my $filename = '263.xml';

open(my $fh, $filename)

perl -p -i -e '$fh if /<caldata chopper="on"/ "(\d+)"/; print $fh;' 

但是

Warning: Use of "-p" without parentheses is ambiguous at a1.pl line 7.
syntax error at a1.pl line 7, near ")

perl "
Execution of a1.pl aborted due to compilation errors.

我想用

分隔行
caldata chopper="on"

和caldata chopper =&#34; off&#34; 分成单独的文件。 这是整行

<caldata chopper="on" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)">

1 个答案:

答案 0 :(得分:6)

为了澄清为什么发布的代码&#34;没有意义&#34;,perl -p -i -e是你自己在命令行上键入的东西,而不是进入Perl程序的东西。基本上,perl -p -i -e '...'本身就是运行的程序。 perldoc perlrun更详细地解释了,但是:

  • -p...代码周围放置一个循环,针对输入文件的每一行运行它
  • -i表示编辑输入文件(而不是为输出创建任何新文件)
  • -e告诉perl您提供可执行代码作为命令行的一部分,而不是从文件运行程序

执行您尝试的操作的正确方法是(警告 - 未经测试的代码):

#!/usr/bin/env perl

use strict;
use warnings;

open my $in, '<', '263.xml' or die "Can't open input file: $!";
open my $out_on, '>', 'on.xml' or die "Can't open 'on' output file: $!";
open my $out_off, '>', 'off.xml' or die "Can't open 'off' output file: $!";

while (my $line = <$in>) {
  $line =~ /<caldata chopper="(on|off)"/;
  if ($1 eq 'on') {
    print $out_on, $line;
  } elsif ($1 eq 'off') {
    print $out_off, $line;
  }
}

但请注意,此技术不会创建正确的XML输出文件。它只会生成包含caldata元素列表的文件,而不需要任何其他周围元素来生成单个格式良好的XML文档。如果您需要格式良好的XML文档,我建议您查看XML::Twig,而不是尝试手动解析或生成XML。