2016-08-26 2 views
-1

Мой кодКак разбить файл 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 измельчителя = "выключено" в отдельные файлы. Это целая линия

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

То, что вы разместили как «_My code_», не имеет смысла. У вас буквально есть строка с 'perl ...' в скрипте? 'Perl' - некотируемое слово в скрипте. Само регулярное выражение прекрасно (нет необходимости скрывать '' 'или что-то еще). Однако использование' $ fh' неверно - это дескриптор файла. Кроме того, вам явно не хватает ';' на этой строке 7 'from (the first) error – zdim

+0

@zdim Да, я начинаю с perl.How должна выглядеть строка? –

+0

ОК. Это далеко не правильный Perl.' open' line нуждается в ';'. '$ fh 'является _filehandle_, который дает доступ к ресурсу (файлу) - вы используете его для чтения данных из указанного ресурса, а не для его печати. ​​Таким образом, вам понадобится цикл, например' while (<$fh>) '. 'perl' в языке. Утверждение' $ fh, если /.../ 'не имеет смысла, я не понимаю, что вы подразумеваете под этим. Фрагментная часть регулярного выражения' /.../ ', является отлично, но остальное (второе '/.../') не имеет смысла. И т.д. Я бы предложил сначала изучить основы языка. – zdim

ответ

6

Чтобы выяснить, почему посланной код «не имеет смысла», 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 вручную.

Смежные вопросы