[Cologne-pm] PERL - schnelles suchen & ersetzen in 100MB Datei
Wolfgang Weisselberg
pl3rofb02 at sneakemail.com
Wed Apr 28 11:59:58 CDT 2004
A. Pagaltzis wrote 143 lines:
> * Wolfgang Weisselberg <pl3rofb02 at sneakemail.com> [2004-04-27 22:32]:
> > 2. print($i), next unless m/$matches/; # and using qr//
> > [...]
> > - Matches sind ein seltenes Ereignis. Nicht-Matches sind
> > haeufig. Also sollte man auf Nicht-Matches optimieren.
> Man macht (fast) nie ein m//, um zu prüfen ob ein s/// nötig ist,
> denn s/// muss die gleiche Arbeit wie m// nochmal leisten. Man
> macht gleich das s///, denn anhand von dessn Rückgabewert sieht
> man, ob was passiert ist oder nicht.
Wenn ich 25 s/// habe, kostet mich jede Zeile 25. Wenn ich m//
verwende, kostet mich jeder nicht-match (also die groesste Zahl)
viel weniger als 25, zumal m// vorkompiliert ist ...
> > sub gen_matchstrings { # where is map for hashes??
> > my $in = shift;
> > my $string = join( '|', keys %$in );
> > return qr/$string/; # precompile regexp
> > }
> Vorsicht! Du willst
> my $string = join( '|', map quotemeta, keys %$in );
> Sonst spielen zufällig vorhandene Metazeichen in der Eingabe ihre
> Streiche mit dir.
Nein. Normalerweise hast du recht, aber mit quotemeta liefert
der Code ein anderes Ergebnis als das von Cem vorgegebene.
Es ist wohl Aufgabe des Benutzers/Programmiers, das ERSETZUNGSHASH
richtig zu fuellen :-)
> > foreach my $from ( keys %$replaces_href ) {
> > next unless /$from/;
> > s/$from/$$replaces_href{$from}/g;
> > delete $$replaces_href{$from};
> > }
> Ganz schön umständlich und ineffizient.
> s/// muss für jedes $from das Pattern neu kompilieren.
Wird maximal scalar(keys(%$replaces_href)) aufgerufen, also keine
100 mal (meine Annahme) --- da ist ein Optimieren ohne vorherige
Profilierung voreilig.
> Ausserdem wieder die gleiche Falle mit Metazeichen in der
> Eingabe; es sollte C<s/\Q$from/.../> sein.
S.o.
-Wolfgang
More information about the Cologne-pm
mailing list