[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