[Cologne-pm] PERL - schnelles suchen & ersetzen in 100MB Datei

A. Pagaltzis pagaltzis at gmx.de
Wed Apr 28 12:28:41 CDT 2004


* Wolfgang Weisselberg <pl3rofb02 at sneakemail.com> [2004-04-28 19:01]:
> A. Pagaltzis wrote 143 lines:

Nope, ich habe viel weniger geschrieben, der Rest war zitiert.

> > 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.

Nein, du machst nur ein s/// mit dem gleichen Pattern wie du für
das m// verwenden willst.

> > 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.

Wie soll das zustande kommen?

> 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.

Die Schleife ist komplett überflüssig; es ist nicht in erster
Linie Optimierung, was ich vorschlage, sondern semantische
Reduktion aufs Wesentliche. Wie so oft ist das dann auch in der
Laufzeit effizienter.

> > Ausserdem wieder die gleiche Falle mit Metazeichen in der
> > Eingabe; es sollte C<s/\Q$from/.../> sein.
> 
> S.o.

Verstehe ich in diesem Fall noch weniger. Warum ergibt
C<s/$from/.../> etwas anderes als C<s/\Q$from/.../> wenn
C<$from = 's1'>?

-- 
Gruss,
Aristoteles
 
"Wer nicht über sich selbst lachen kann, nimmt das Leben nicht ernst genug."



More information about the Cologne-pm mailing list