[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