删除冗余数组元素

时间:2014-02-25 08:37:22

标签: arrays perl

我有一个包含许多主机名的数组。我想删除这个数组的冗余元素,即:

  • 如果存在重复条目,则会删除其中一个条目。
  • 如果同时存在www.example.comexample.com,则会移除www.example.com

删除重复项已经回答here,但我如何实现第二个条件?

编辑:为了澄清,我必须提到www.可能不是唯一存在的内容 - 它可能也是abc.def.ghi.foo.bar.baz.quxfoo.bar.baz.qux,在这种情况下,前者会被删除

2 个答案:

答案 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.