[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