Wie kann ich Zeichenfolge, um zwischen zwei Dokumenten in Perl überein?
-
04-10-2019 - |
Frage
Ich habe ein Problem bei der Herstellung eines PERL-Programm für die Wörter in zwei Dokumenten übereinstimmen. Lassen Sie uns sagen, es gibt Dokumente A und B.
Also habe ich die Worte in dem Dokument A löschen möchten, die nicht im Dokument B ist.
Beispiel 1 :
A: Ich esse Pizza
B: Sie gehen auf den Markt und essen Pizza
Ergebnis: Pizza essen
Beispiel 2 : A: Pizza essen
B: Pizza essen
Ergebnis: Pizza (Das Wort ist, um relevant, so "essen" gestrichen.)
Ich benutze Perl für das System und die Sätze in jedem Dokument ist nicht in einem großen Zahlen, also denke ich, dass ich SQL nicht
verwendenUnd das Programm ist ein subproram zur automatischen Essay Bewertung für indonesische Sprache (Bahasa)
Thanx, Sorry, wenn meine Frage ist ein wenig verwirrend. Ich bin wirklich neu zu ‚dieser Welt‘:)
Lösung
OK, ich bin ohne Zugang im Moment so ist dies nicht zu 100% garantiert oder sogar kompilieren, soll aber genügend Führung bieten:
Lösung 1 : (Wortfolge spielt keine Rolle)
#!/usr/bin/perl -w
use strict;
use File::Slurp;
my @B_lines = File::Slurp::read_file("B") || die "Error reading B: $!";
my %B_words = ();
foreach my $line (@B_lines) {
map { $B_words{$_} = 1 } split(/\s+/, $line);
}
my @A_lines = File::Slurp::read_file("A") || die "Error reading A: $!";
my @new_lines = ();
foreach my $line (@A_lines) {
my @B_words_only = grep { $B_words{$_} } split(/\s+/, $line);
push @new_lines, join(" ", @B_words_only) . "\n";
}
File::Slurp::write_file("A_new", @new_lines) || die "Error writing A_new: $!";
Dies sollte eine neue Datei "A_New" erstellen, die nur A Worte enthält, die in in B sind.
Dies hat einen leichten Fehler - es ersetzt jede Mehr Leerzeichen in Datei A mit einem einzigen Raum, so
word1 word2 word3
wird geworden
word1 word2 word3
Es kann festgelegt werden, sondern würde wirklich ärgerlich sein, dies zu tun, so dass ich nicht die Mühe, wenn Sie absolut, dass Leerzeichen 100% korrekt aufbewahrt erfordern werden
Lösung 2 : (Wortfolge Fragen, aber Sie können für die Erhaltung Leerzeichen überhaupt heraus ohne Bezug Wörter aus A drucken)
#!/usr/bin/perl -w
use strict;
use File::Slurp;
my @A_words = split(/\s+/gs, File::Slurp::read_file("A") || die "Error reading A:$!");
my @B_words = split(/\s+/gs, File::Slurp::read_file("B") || die "Error reading B:$!");
my $B_counter = 0;
for (my $A_counter = 0; $A_counter < scalar(@A_words); ++$A_counter) {
while ($B_counter < scalar(@B_words)
&& $B_words[$B_counter] ne $A_words[$A_counter]) {++$B_counter;}
last if $B_counter == scalar(@B_words);
print "$A_words[$A_counter]";
}
Lösung 3 (warum brauchen wir Perl wieder? :))
Sie können dies ohne Perl in Shell triviale tun (oder über system () Anruf oder Backticks in Mutter Perl-Skript)
comm -12 A B | tr "\012" " "
das von Perl nennen:
my $new_text = `comm -12 A B | tr "\012" " " `;
Aber siehe meinen letzten Kommentar, warum diese „schlechte Perl“ betrachtet werden kann ... zumindest wenn man dies mit sehr vielen Dateien in einer Schleife zu tun ist, um Leistung iteriert und Pflege.