删除perl数组中的ALMOST重复

Eva*_*ler 0 arrays perl

我有一个包含以下元素的数组:

my @array = ("\"Foo in Bar\" on Mon 09 Feb 2015 08:07:44 AM PST",
"\"Foo in Bar\" on Mon 09 Feb 2015 08:07:47 AM MST",
"\"Foo in Bar\" on Mon 09 Feb 2015 08:07:49 AM MST",
"\"Apple in Pie\" on Mon 09 Feb 2015 10:22:32 AM MST",
"\"Foo in Bar\" on Mon 09 Feb 2015 08:07:51 AM MST",
"\"Rock in Out\" on Mon 09 Feb 2015 11:17:41 AM PST") 
Run Code Online (Sandbox Code Playgroud)

我想对这个数组进行排序,以便删除所有带有重复字符串的元素(在""中).这有点独特的原因是因为与每个字符串相关的时间略有不同,但并不多.

这是我想要输出的样子:

"\"Foo in Bar\" on Mon 09 Feb 2015 08:07:49 AM MST",
"\"Apple in Pie\" on Mon 09 Feb 2015 10:22:32 AM MST",
"\"Rock in Out\" on Mon 09 Feb 2015 11:17:41 AM PST"
Run Code Online (Sandbox Code Playgroud)

我真的不在乎排序时间,只是删除了""中的重复.

到目前为止,这是我的思考过程:

    my @row;
    foreach my $row (@array) {
        my $name = $row;
        $name =~ s/\son.*//;
        next if (grep {$_ =~ /($name)/} @row);
        push(@row,$row);
    }
Run Code Online (Sandbox Code Playgroud)

必须有更好的方法来做到这一点.另外,我的方法有问题(grep似乎没有按预期工作,它不会进入下一个语句).

ike*_*ami 5

以下内容将没有重复的列表分配给@filtered:

my %seen;
my @filtered = grep { !$seen{$_}++ } @array;
Run Code Online (Sandbox Code Playgroud)

在你的情况下,需要一个小的tweek.引号之间的子字符串决定了您是否已经看过该项目,因此需要使用它来代替$_.

my %seen;
my @filtered = grep { /^"([^"]+)"/ && !$seen{$1}++ } @array;
Run Code Online (Sandbox Code Playgroud)