[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