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

Wolfgang Weisselberg weissel at netcologne.de
Thu Apr 29 06:54:06 CDT 2004


A. Pagaltzis verschickte 67 Zeilen:

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

Fuer's Kuerzen bist *du* verantwortlich.

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

Der Code ist nicht aequivalent.  Da keine Spezifikation
ausser dem Code selber vorhanden ist, ist alles ausser einer
Aequivalenzumformung zu dokumentieren.

Vergleiche:

    $_ = "aabbaa";
    %replaces = ( bb  => 'aa',
                  aaa => 'x', );

    $replaces_href = \%replaces;
    foreach my $from ( keys %$replaces_href ) {
        next unless /$from/;
        s/$from/$$replaces_href{$from}/g;
        delete $$replaces_href{$from};
    }
    print $_;

Bei *mir* kommt in *diesem* Falle 'xx' raus.  Bei deinem Code
auch?  Nein?  Dann ist er nicht aequivalent.

> > >     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 keine Aequivalenzumformung des Codes, und die Metazeichen
koennen sehr wohl gewollt sein.  Cem kann vollkommen legal
"Anton(ina)?" als Suchmuster angeben ...

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

Deine Loesung ist nicht unbedingt lesbarer.


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

Weil s1 von Lauf zu Lauf VARIABEL sein darf?
s.o.

-Wolfgang



More information about the Cologne-pm mailing list