[Cologne-pm] Brauche mal ne schnelle Hilfe zu Umlauten
Michael Lamertz
mike at lamertz.net
Thu Feb 5 06:37:58 CST 2004
On Thu, Feb 05, 2004 at 07:46:55AM +0100, A. Pagaltzis wrote:
> * Michael Lamertz <mike at lamertz.net> [2004-02-03 14:44]:
> > # Das hier geht leider nicht in einem Schritt, da qr ein Quote-Operator
> > # ist, und darin zwar Variablen, aber leider kein Code interpoliert
> > # wird:
>
> Wenn's um's Prinzip geht, geht's doch:
>
> our $umlauts = qr/[@{[ join ''. keys %map ]}]/;
Ja, ja, ...
> > our $umlauts = '[' . join('', keys %uml) . ']';
> > $umlauts = qr($umlauts);
>
> Aber das ist dann doch lesbarer. Wenn es andererseits wirklich
> auf Wartbarkeit ankommt schreibe ich das wahrscheinlich so:
>
> our $umlauts = do {
> my $mapped_chars = join('', keys %map);
> qr/([$mapped_chars])/;
> };
*DAS* gefaellt mir! Richtig nett.
> > Btw: Version 0.1 sah so aus:
> >
> > s/(.)/$map{$1} || $1/ge
> >
> > Benchmark.pm ist unser Freund:
> >
> > Whoa! Faktor 10. Da werde ich mich doch nicht ueber eine
> > Variable mehr aufregen :)
>
> Nimmt wenig Wunder, wenn du bedenkst das diese Variante
> grundsätzlich alle Zeichen angefasst hat und dass Umlaute selten
> sind.
Klar.
> Ausserdem hast du den Geschwindigkeitsvorteil von qr// nur dann,
> wenn im Ausdruck nichts aber auch *garnichts* anderes als die
> Variable drinsteht. Bei deinem s/($umlauts)/../ muss aufgrund der
> Klammern der Ausdruck neukompiliert werden. Immerhin passiert das
> bei neueren Perl-Versionen trotz der Variablen nicht mehr bei
> *jedem* Schleifendurchlauf, aber geprüft werden muss trotzdem.
> Also pack die Klammern wie ich in's qr// und nimm sie unten raus.
> Benchmark.pm dürfte so noch ein paar Iterationen/Sek mehr messen.
Dass man das Grouping in die $rx packen kann war mir tatsaechlich
vollkommen unklar. Und ja, die verbesserung hat bei mir zwischen 7 und
10% betragen. Das ist schon 'ne Menge.
> Übringens verbrauchen my-Variablen ein paar Takte weniger als
> Paketvariablen. Wird schon am Output von B::Terse deutlich.
Jo.
Was ich in dem Zusammenhang noch interessant fand, ist die Tatsache,
dass
s/a/b/g while (<DATA>);
schneller ist als
while (<DATA>) { s/a/b/g }
/me dachte bisher, dass die Modifier nur Syntactic Sugar sind.
Mike
--
Well, then let's give that Java-Wussie a beating... (me)
Michael Lamertz | +49 2234 204947 / +49 171 6900 310
Sandstr. 122 | mike at lamertz.net
50226 Frechen | http://www.lamertz.net
Germany | http://www.perl-ronin.de
More information about the Cologne-pm
mailing list