Text mit Liste aus Wörten effizient vergleichen ?
$xNeTworKx
- perl
0 Sonic
Hi,
Angenommen ich habe eine Liste aus vielen Wörtern und ich würde jedes dieser Wörter mit allen Wörtern aus einem Text vergleichen und ggf. löschen oder ersetzen wollen, könnte ich das natürlich leicht mit einer foreach Schleife tun, aber gäbe es nicht vielleich einen effizienteren Weg, weil wenn ich da 40 Wörter mit dem ganzen Text in einer Schleife vergleichen muss, ist das schon sehr viel Aufwand für Perl ?
$xNeTworKx.
Also ich würde einfach folgendes machen, nämlich die Wörter, die Du suchst und die, durch die Du sie ersetzen willst, in ein Hash packen und dann wie in SelfHTML beschrieben eine Schleife bauen, die ungefähr so aussieht:
while (($altes_wort, $neues_wort) = each(%Ersetzungen)) {
$text =~ s/$altes_wort/$neues_wort/g;
}
Hi,
Angenommen ich habe eine Liste aus vielen Wörtern und ich würde jedes dieser Wörter mit allen Wörtern aus einem Text vergleichen und ggf. löschen oder ersetzen wollen, könnte ich das natürlich leicht mit einer foreach Schleife tun, aber gäbe es nicht vielleich einen effizienteren Weg, weil wenn ich da 40 Wörter mit dem ganzen Text in einer Schleife vergleichen muss, ist das schon sehr viel Aufwand für Perl ?
$xNeTworKx.
Hi,
while (($altes_wort, $neues_wort) = each(%Ersetzungen)) {
$text =~ s/$altes_wort/$neues_wort/g;
}
Nun ja, aber so müsste ich erst wieder den Hash mit den Werten füttern. Ausserdem ersetze ich sowieso alle Übereinstimmungen mit dem gleichen Wort, aber der Ansatz hilft mir schon weiter, danke.
$xNeTworKx.
Ja, aber die Werte (also die Wörter, nach denen Du suchst), mußt Du ja sowieso irgendwie einspeisen (kann ja eine Liste in einer separaten Datei sein, die eingelesen wird).
Wenn Alles durch das Gleiche ersetzt werden soll dann kannst Du ja ein Array nehmen (wie gesagt z.B. aus einer separaten Datei eingelesen) und dann eben s/$_/Neues Wort/g; schreiben. Ich glaube nicht, daß man das noch besonders vereinfachen kann
Nun ja, aber so müsste ich erst wieder den Hash mit den Werten füttern. Ausserdem ersetze ich sowieso alle Übereinstimmungen mit dem gleichen Wort, aber der Ansatz hilft mir schon weiter, danke.
$xNeTworKx.
use Mosche;
[TOFU]
Bitte lies http://learn.to/quote, damit du weisst, was TOFU ist und warum mann es nicht entstehen lassen sollte.
use Tschoe qw(Matti);
Hi,
habs jetzt glaube ich relativ effizient gelöst :
(Die Wörter sind durch | getrennt)
open(FILE,'censored.cgi') or die "Kann censored.cgi nicht oeffnen : $!\n";
local $/;
my @input = split('|',<FILE>);
.
.
.
foreach(@input) {
$text =~ s/$_/censored/sig;
}
..oder noch eine bessere Lösung ?
$xNeTworKx.
.... ohne local $/; natürlich. War nur ein Überbleibsel =)
use Mosche;
[ Wörter aus Text ersetzen ]
habs jetzt glaube ich relativ effizient gelöst :
(Die Wörter sind durch | getrennt)
Wenn die sowieso mit | getrennt sind, dann kannst du ja auch deine Regex so einsetzen:
local $/ = undef;
my $re = <FILE>;
$text =~ s/$re/censored/eg;
Das 'e' steht für evaluate (oder execute) und bewirkt, dass dein $re geparst wird.
Solltest du mal ausprobieren, ist leider ungetestet, da ich hier (in der Schule) kein Perl zur Verfügung hab.
use Tschoe qw(Matti);