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循環打印重複,因爲功能,但也許存在另一種方式。
我研究這個,但我找不到解決方案。
感謝您的耐心等待。
爲什麼不打印重複的行一次:!'的perl -ne」/^ \ + $/g的&&打印,除非$ W {$ _ } ++'文件' –