LINUX.ORG.RU

как это будет на перле наиболее красиво?


0

0

Есть не мой скрипт, который парсит xml и что-то на основе этого делает,
xml создает другой скрипт,

проблема в том, xml невалидная,
там есть строчка которую надо удалить,
я знаю какая перед ней, но вот как удалить наиболее красиво и быстро?

пока что делаю так:

open(XML, "<file.xml") or die "can not open file.xml";
open(XMLOUT, ">nexfile.xml") or die "can not open newfile.xml";
while (my $line = <XML>) {
  if ($line == "special line") {
    $line = <XML>;
  } else {
    print XMLUOT $line;
  }
}
close(XML); 
close(XMLOUT);

наверное можно как-то более правильно сделать?
anonymous

> я знаю какая перед ней, но вот как удалить наиболее красиво и быстро?

приведенный код удалит именно "special line", а не ту, что после нее. 
Если именно это и хочется, то тело цикла можно заменить на

print XMLOUT $line unless $line eq "special line";
                                ^^

phoenix ★★★★
()
Ответ на: комментарий от phoenix

2phoenix: Исходный скрипт удалит две строки, 
          "special line" и следующую за ней.
---------------------------------------------------------------
2anonymous: Удалить строку, следующую за "special line":

while (my $line = <XML>) {

  # пропустить строку след. за 'special line'
  my $a = <XML> if ("$line" eq 'special line');

  print XMLOUT "$line";
}

Можно вместо цикла while сделать цикл map, но сути это не изменит.

sdio ★★★★★
()
Ответ на: комментарий от sdio

капец :) я подумал, что строка

$line = <XML>

присваивает значение "<XML>" переменной $line (т.е. просто тэг <xml> туда записывает зачем-то) :)

phoenix ★★★★
()

Напишу свой вариант... Просьба не пинать.

open(XML, "+>file.xml") or die "can not open file.xml:$!";

while (my $line = <XML>) {

if ($line eq "special line") { $line = "тото"; } else { print XMLUOT $line; } }

close(XML) or die "can't close file.xml:$!\n";

paranormal ★★
()
Ответ на: комментарий от paranormal

Ой куча багов... Еще не проснулся. Внатуре.

open(XML, "+>file.xml") or die "can not open file.xml:$!";

while (my $line = <XML>){ if ($line eq 'тото') { $line =~ s/тото/на_тото/; }

}

paranormal ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.