【发布时间】: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 && print unless $w{$_}++' file
标签: regex perl loops foreach while-loop