2017-07-27 59 views
0

I搜索和研究解決方案,但沒有成功。perl循環避免在正則表達式匹配中打印重複

的file.txt的:

Name Server: NS1.SERVER.COM 
Name Server: NS2.SERVER.COM 
.......................... 
.......................... 
Name Server: NS1.SERVER.COM 
Name Server: NS2.SERVER.COM 
Whois server: whois.directnic.com! 
.......................... 
.......................... 
Name Server: NS1.SERVER.COM 
Name Server: NS2.SERVER.COM 
Whois server: whois.directnic.com! 
.......................... 
.......................... 

當我運行:

use strict; 
use warnings; 

my $filename = 'file.txt'; 
open(my $fh, '<:encoding(UTF-8)', $filename) 
    or die "Could not open file '$filename' $!"; 

while (my $row = <$fh>) { 
     if ($row =~ /^Name\sServer:\s+(.*+)?/) {   
      print "dns $1\n"; 
     } 

     if ($row =~ /Whois.+server:.(.*)/) { 
      print "whois server: $1\n"; 
     } 
} 

輸出:

dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
whois server: whois.directnic.com! 
dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
whois server: whois.directnic.com! 

我想是這樣的:

dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
whois server: whois.directnic.com! 

我知道我可以使用最後 (如果你已經使用在C「破發」運營商或類似的語言,它是這樣的。)

如果我最後設置;在第一個條件我得到這個:

dns NS1.SERVER.COM 

如果我設置最後;在第二個狀態,我得到這樣的:

dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
dns NS1.SERVER.COM 
dns NS2.SERVER.COM 
whois server: whois.directnic.com! 

我找到一個解決辦法,但使用散列,同時,增加數量和grep,像這樣:

my %count_of; 
my %count_of_two; 
while (my $row = <$fh>) { 

      if ($row =~ /^Name\sServer:\s+(.*+)?$/) { 

       $count_of{$row}++; 

      } 

      if ($row =~ /Whois.+Server:.(.*)/) { 

       $count_of_two{$row}++; 
      } 

    } 
    print join "\n", grep { $count_of{$_} > 1 } keys %count_of; 
    print join "\n", grep { $count_of_two{$_} == 1 } keys %count_of_two; 

¿我如何能做到這一點與同時或的foreach ?

注:我想我知道爲什麼while循環打印重複,因爲功能,但也許存在另一種方式。

我研究這個,但我找不到解決方案。

感謝您的耐心等待。

+0

爲什麼不打印重複的行一次:!'的perl -ne」/^ \ + $/g的&&打印,除非$ W {$ _ } ++'文件' –

回答

2

最簡單的方法可能是使用散列(在我的示例中稱爲%seen),它跟蹤您所看到的字符串。

使你的代碼最小的變化,我們得到:

use strict; 
use warnings; 

my $filename = 'file.txt'; 
open(my $fh, '<:encoding(UTF-8)', $filename) 
    or die "Could not open file '$filename' $!"; 

my %seen; 

while (my $row = <$fh>) { 
     if ($row =~ /^Name\sServer:\s+(.*+)?/) { 
      print "dns $1\n" unless $seen{$1}++; 
     } 

     if ($row =~ /Whois.+server:.(.*)/) { 
      print "whois server: $1\n" unless $seen{$1}++; 
     } 
} 
+0

謝謝,那份工作。 –

+0

好。但你明白這一點,還是隻是盲目地從互聯網上覆制? –

+0

嗨@Dave Cross,對於延遲抱歉。我對代碼有一點了解。你能告訴我怎樣才能設置一個櫃檯?如:計數1計數2計數3 ...僅用於不重複的比賽。我設置了一個計數,但它像1,2,3,4,5 ......(它計數重複的匹配) –