2017-07-27 8 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を増やし、一方で私は、解決策を見つけるが、ハッシュを使用して、次のように:私はしばらくの間またはforeachのでこれを行うことができますどのように

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; 

¿ ?

注:なぜ私はループ印刷中にその機能が重複しているのか知っていると思いますが、別の方法で存在する可能性があります。

私はこれについて研究しますが、解決策を見つけることができません。

ご理解いただきありがとうございます。

+0

なぜもう一度繰り返し行を印刷:!。 'perlの-ne」/^\ + $/gで&&印刷ワット$ {$ない限り_ } ++ 'file' –

答えて

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クロス、遅延のために申し訳ありません。私はコードについて少しは理解しています。カウンターを設定するにはどうすればいいですか? like:count 1 count 2 count 3 ...重複していないものだけを検索します。私はカウントを設定しますが1,2,3,4,5のように数えます。(重複したマッチをカウントします) –

関連する問題