【问题标题】:perl loop avoid print duplicate in regex matchperl循环避免在正则表达式匹配中打印重复
【发布时间】:2018-01-03 05:19:58
【问题描述】:

我搜索并研究解决方案,但没有成功。

文件.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!

我知道我可以使用 Last (如果你在 C 或类似语言中使用过“break”运算符,就是这样。)

如果我最后设置;在第一个条件下,我得到了这个:

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;

¿如何使用 while 或 foreach 做到这一点?

注意:我想我知道为什么 while 循环打印重复,因为该功能,但可能以另一种方式存在。

我对此进行了研究,但找不到解决方案。

感谢您的耐心等待。

【问题讨论】:

  • 为什么不打印一次重复的行:perl -ne '!/^\.+$/g &amp;&amp; print unless $w{$_}++' file

标签: regex perl loops foreach while-loop


【解决方案1】:

最简单的方法可能是使用哈希(在我下面的示例中称为%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}++;
      }
}

【讨论】:

  • 好。但是你看懂了吗,还是只是从网上盲目抄袭?
  • 嗨@Dave Cross,抱歉耽搁了。我对代码有点了解。你能告诉我¿我怎样才能设置一个计数器?像: count 1 count 2 count 3 ... 仅用于不重复的匹配项。我设置了一个计数,但它计数为 1,2,3,4,5...(它计算重复匹配)
  • @Thenothing:如果您有一个新问题,那么最好将它作为一个全新的问题提出。
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2011-05-16
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多