2016-02-17 68 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

雖然這可能有效,但它是各種各樣的錯誤。請至少使用'嚴格'和'使用警告'全部',並看看[perlstyle](http://perldoc.perl.org/perlstyle.html) – Borodin

+0

爲什麼這是「各種各樣的錯誤」,doesn它會回答這個問題嗎?它效率低下嗎?爲什麼要對這樣一個簡短的代碼段使用strict/warnings?沒有警告,只有11行代碼。 – kba