Как я могу объединить перекрывающиеся элементы, используя Perl? - PullRequest
2 голосов
/ 24 октября 2009

Я уже научился удалять дубликаты в Perl, используя следующий код:

my %seen = ();
my @unique = grep { ! $seen{ $_}++ } @array;

Но что если я захочу объединить перекрывающиеся части? Есть ли простой способ, как в приведенном выше коде, напрямую выполнять работу?

Например, немного входного файла выглядит примерно так:

Anais Nin   :  People living deeply have no fear of death.
Pascal      :  Wisdome sends us back to our childhood.
Nietzsche   :  No one lies so boldly as the man who is indignant. 
Camus       :  Stupidity has a knack of getting its way. 
Plato       :  A good decision is based on knowledge and not on numbers. 
Anais Nin   :  We don't see things as they are, we see them as we are. 
Erich Fromm     :  Creativity requires the courage to let go of certainties. 
M. Scott Peck   :  Share our similarities, celebrate our differences.
Freud       :  The ego is not master in its own house. 
Camus       :  You cannot create experience. You must undergo it. 
Stendhal    :  Pleasure is often spoiled by describing it. 

Выход желания выглядит так:

Anais Nin   :  People living deeply have no fear of death. We don't see things as they are, we see them as we are. 
Pascal      :  Wisdome sends us back to our childhood.
Nietzsche   :  No one lies so boldly as the man who is indignant. 
Camus       :  Stupidity has a knack of getting its way.  You cannot create experience. You must undergo it. 
Plato       :  A good decision is based on knowledge and not on numbers. 
Erich Fromm     :  Creativity requires the courage to let go of certainties. 
M. Scott Peck   :  Share our similarities, celebrate our differences.
Freud       :  The ego is not master in its own house. 
Stendhal    :  Pleasure is often spoiled by describing it. 

Спасибо, как всегда, за любое руководство!

Ответы [ 4 ]

7 голосов
/ 24 октября 2009

Это очень простое применение регулярных выражений и хэшей. Я поместил ваши данные в файл с именем "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";
}
3 голосов
/ 24 октября 2009

Вы можете объединить предложения без проверки существования хеш-элемента. Perl автоматически оживит хеш-элемент, если он еще не существует.

my %lib;
for (<DATA>){
    chomp;
    my ($au, $qu) = split /\s+:\s+/, $_, 2;
    $lib{$au} .= ' ' . $qu;
}

print $_, " : ", $lib{$_}, "\n" for sort keys %lib;

__DATA__
# Not shown.
2 голосов
/ 24 октября 2009
while (<>) {
    ($F1,$F2) = split(/[:\n]/, $_);
    $F1 =~ s/[[:space:]]+//g;
    if (!(defined $a{$F1})) {
        $a{$F1} = $F2;
    }
    else {
        $a{$F1} = "$a{$F1} $F2";
    }
}
foreach $i (keys %a) {
    print $i, $a{$i} . "\n";
}

выход

 $ perl test.pl file
    Freud  The ego is not master in its own house.
    ErichFromm  Creativity requires the courage to let go of certainties.
    Camus  Stupidity has a knack of getting its way.    You cannot create experience. You must undergo it.
    M.ScottPeck  Share our similarities, celebrate our differences.
    Plato  A good decision is based on knowledge and not on numbers.
    Pascal  Wisdome sends us back to our childhood.
    Nietzsche  No one lies so boldly as the man who is indignant.
    AnaisNin  People living deeply have no fear of death.   We don't see things as they are, we see them as we are.
    Stendhal  Pleasure is often spoiled by describing it.
1 голос
/ 25 октября 2009

Я только что просмотрел другие связанные с Perl посты и темы в SO и нашел ответ Шверна на вопрос под названием " Как загрузить файл в хэш Perl? " может на самом деле решить мою проблему. проблема. Похоже, разные люди могут сформулировать один и тот же вопрос совершенно по-разному.

С несколькими необходимыми модификациями и добавлением инструкций по печати хеш-кодов я разработал следующий рабочий код:

#!perl
use warnings;
use autodie;
use strict;

open my $quotes,'<','c:/quotes.txt';
my %hash;
while (<$quotes>)
{
   chomp;
   my ($au, $qu) = split /\s+:\s+/, $_, 2;
   $hash{$au} .= exists $hash{$au}? "$qu" : $qu;

}
print map { "$_ : $hash{$_}\n" } keys %hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...