我的代码
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)">
答案 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。