我已经学习了如何使用以下代码在Perl中删除重复项:
my %seen = ();
my @unique = grep { ! $seen{ $_}++ } @array;
但是,如果我想合并重叠的部分怎么办?有没有像上面的代码这样的简单方法可以直接完成这项工作?
例如,输入文件的一部分看起来像这样:
阿奈斯·宁(Anais Nin):生活在深处的人们不惧怕死亡。
帕斯卡(Pascal):Wisdome使我们回到了童年时代。
尼采:没有人比那个愤慨的人大胆地说谎。
加缪:愚蠢有自己的诀窍。
柏拉图:一个好的决定是基于知识而不是数字。
Anais Nin:我们看不到事情的原样,我们却照原样看。
埃里希·弗洛姆(Erich Fromm):创造力需要勇气放开确定性。
M. Scott Peck:分享我们的相似之处,庆祝我们的不同之处。
弗洛伊德:自我不是自己家里的主人。
加缪:您无法创造经验。您必须接受它。
Stendhal:描述快乐常常会破坏乐趣。
期望输出如下所示:
阿奈斯·宁(Anais Nin):生活在深处的人们不惧怕死亡。我们看不到事物的原样,我们却照原样看到它们。
帕斯卡(Pascal):Wisdome使我们回到了童年时代。
尼采:没有人比那个愤慨的人大胆地说谎。
加缪:愚蠢有自己的诀窍。您无法创造经验。您必须接受它。
柏拉图:一个好的决定是基于知识而不是数字。
埃里希·弗洛姆(Erich Fromm):创造力需要勇气放开确定性。
M. Scott Peck:分享我们的相似之处,庆祝我们的不同之处。
弗洛伊德:自我不是自己家里的主人。
Stendhal:描述快乐常常会破坏乐趣。
与往常一样,感谢您的指导!
最佳答案
这是正则表达式和哈希表的非常简单的应用。我将您的数据放入一个名为“ merge.txt”的文件中。这会将结果打印到标准输出。
#! perl
use warnings;
use strict;
open my $input, "<", "merge.txt" or die $!;
my %name2quotes;
while (my $line = <$input>) {
if ($line =~ /(.*?)\s*:\s*(.*?)\s*$/) {
my $name = $1;
my $quote = $2;
if ($name2quotes{$name}) {
$name2quotes{$name} .= " " . $quote;
} else {
$name2quotes{$name} = $quote;
}
} # You might want to put an "else" here to check for errors.
}
close $input or die $!;
for my $name (sort keys %name2quotes) {
print "$name : $name2quotes{$name}\n";
}