我有一个包含许多主机名的数组。我想删除这个数组的冗余元素,即:
www.example.com
和example.com
,则会移除www.example.com
。删除重复项已经回答here,但我如何实现第二个条件?
编辑:为了澄清,我必须提到www.
可能不是唯一存在的内容 - 它可能也是abc.def.ghi.foo.bar.baz.qux
和foo.bar.baz.qux
,在这种情况下,前者会被删除
答案 0 :(得分:4)
所以你要说你要删除已经存在后缀的元素。那么我们可以将后缀问题转换为前缀问题。然后我们可以使用在有序数组前缀中的特征在字符串本身之前。然后我们删除字符串,如果前一个字符串是它的前缀。
my @array = qw(foo.com bar.net www.example.com example.com
abc.def.ghi.foo.bar.baz.qux foo.bar.baz.qux);
my @result = do {
my $p;
map scalar reverse, grep {
my $x = !defined $p || !m/^\Q$p/;
if($x) {
$p = $_;
$p .= '.' unless m/\.$/;
}
$x
} sort map scalar reverse, @array;
};
use 5.10.0;
say for @result;
答案 1 :(得分:0)
从我们映射的主foreach
中的here开始,到%seen
哈希,通用已经看到的条目。
在#1
,我们知道$k
是一个东道主,因此我们检查它是否以www.
字符串开头,更好:每个键(我的意思是每个{{ 1}})被迫以$k
开始。
在www.
附近,您可以使用其他正则表达式来细化#2
值(修剪空格,删除结尾斜杠或$k
等)。
http://
结果是一个具有唯一#!/usr/bin/perl -w
use warnings;
use strict;
my @hostnames = qw(foo.com bar.net www.example.com example.com);
my %seen = ();
my @result = ();
foreach my $k (@hostnames) {
$k = "www." . $k if not $k =~ /^www\./; #1
... #2
if (not $seen{$k}) {
push @result, $k;
$seen{$k} = 1;
}
}
起始主机名的数组:
www.