我有一个包含以下元素的数组:
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似乎没有按预期工作,它不会进入下一个语句).
以下内容将没有重复的列表分配给@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)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |