[Cologne-pm] Brauche mal ne schnelle Hilfe zu Umlauten
A. Pagaltzis
pagaltzis at gmx.de
Thu Feb 5 00:46:55 CST 2004
* 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 ]}]/;
> 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])/;
};
Bei Zuweisungen mit Hilfe von do { } und my- Variablen
irgendwelche Zwischenschritte zu isolieren tue ich übrigens
mittlerweile gerne und oft; ich finde, es schafft einen schönen
Rahmen für ein isoliertes Stückchen Code.
> 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.
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.
Übringens verbrauchen my-Variablen ein paar Takte weniger als
Paketvariablen. Wird schon am Output von B::Terse deutlich.
--
Gruss,
Aristoteles
"Wer nicht über sich selbst lachen kann, nimmt das Leben nicht ernst genug."
More information about the Cologne-pm
mailing list