2016-02-17 4 views
-1

Если строка IN(..) и строка OUT(..) имеют одинаковую строку в их круглых скобках, затем удалите строку OUT(..).Удалить строки, содержащие одну строку

Мой входной файл, как:

IN(ABC); 
IN(DEF);   
IN(FGH);   
OUT(QWE);  
OUT(ABC);  
OUT(DEF); 

Мой желаемый результат:

IN(ABC); 
IN(DEF); 
IN(FGH); 
OUT(QWE); 

ответ

-1

В предположении, что все IN(...) линии до OUT(...) линий (т.е. сортировка), должно работать :

my %in; 
while (<DATA>) { 
    if (/^IN\((.*?)\)/) { 
     $in{$1} = 1; 
    } elsif (/^OUT\((.*?)\)/) { 
     if ($in{$1}) { 
      next; 
     } 
    } 
    print $_; 
} 

__DATA__ 
IN(ABC); 
IN(DEF); 
IN(FGH); 
OUT(QWE); 
OUT(ABC); 
OUT(DEF); 

Идея заключается в использовании хеша для отслеживания которые использовали значения IN. Пройдите по строкам данных, если это строка IN, сохраните значение и распечатайте строку. Если это строка OUT и ее нет в списке признанных значений IN, распечатайте ее, в противном случае пропустите ее.

+0

Хотя это может сработать, все это не так. Пожалуйста, по крайней мере 'use strict' и' use warnings 'all'' и взгляните на [perlstyle] (http://perldoc.perl.org/perlstyle.html) – Borodin

+0

Почему это «все виды неправильного», doesn Он отвечает на вопрос? Это неэффективно? Зачем использовать строгие/предупреждающие сообщения для такого короткого фрагмента? Предупреждений не было, это всего лишь 11 строк кода. – kba

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