[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