我已经学习了如何使用以下代码在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";
}

10-07 15:04