Thread Reguläre Ausdrücke vorkompilieren: (Wie bekomme ich Parameter ans qr//?) (13 answers)
Opened by Crian at 2004-03-12 14:46

Crian
 2004-03-12 14:46
#80903 #80903
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ich habe ein Programm, dass aus einer Datei >1000 roh vorformulierte reguläre Ausdrücke ausliest, diese verfeinert und dann auf jeden Datensatz einer anderen Datei anwendet.

Die Urversion eines nicht Perl-vertrauten Kollegen führte jeden dieser regulären Audrücke in jedem Datensatz erneut aus, wodurch das Programm irre langsam wird (etwa 6h für ca 600k Datensätze).

Ich habe dann eine Version geschrieben, die im BEGIN-Block ein Modul schreibt, in dem eine Funktion enthalten ist, die diese ganzen regulären Ausdrücke durchtestet. Danach wird dieses Modul dann mit use eingebunden und die Funktion verwendet. Das funktioniert auch wunderbar, und es braucht jetzt 10 Minuten statt 6 Stunden. So weit so gut.

Dann erinnerte ich mich daran, dass es den vorkompilierungs-Operator qr// gibt. Also dachte ich mir, ich könnte mir das Erzeugen einer externen Moduldatei vielleicht sparen und einfach die vorkompilierten regulären Ausdrücke in meinem AoH ablegen.

Das Problem ist, dass die produzierten verfeinerten RE's schon die Form

Code: (dl )
m~REGULAERERAUSDRUCK~ig


haben. Nagut, also dachte ich mir, schneide ich doch einfach mit

Code: (dl )
	my ($qr, $mod) = $re =~ m#^m~(.*)~(.*)$#;


(dabei enthält $re den obigen regulären Ausdruck) den eigentlichen Ausdruck und seine Parameter in zwei Variablen aus.

jetzt ist die Frage, wie bekomme ich die Parameter an den qr-Teil drangeklebt? Auf die naive Weise

Code: (dl )
		     re     => qr~$re~$mod,


klappt es nicht (was mich auch nicht sehr wundert). Die Frage ist jetzt, wie mache ich es dann?

Im Perl Kochbuch gibt es auch ein Kapitel zu diesem Thema habe ich gesehen, bei mir Abschnitt 6.10. Interpolierte Matches beschleunigen (S. 191). Da ist meine Modul-erzeugungsvariante gar nicht dabei, dafür einige andere nette Methoden. Die möchte ich aber eigentlich gar nicht mehr heranziehen, ich habe ja schon eine funktionierende Methode, mich würde nur mal theoretisch interessieren, wie und ob es mit qr geht (und dann auch praktisch, wie schnell es im Vergleich zu meiner Methode ist).

Mir fällt gerade ein, vielleicht geht es über
Code: (dl )
(?[Modifikator]:Muster)


also so:

Code: (dl )
		     re     => qr~(?$mod:$re)~,


?

Das probiere ich gleich mal aus ...

... ja das schluckt er, aber die regulären Ausdrücke erzeugen kein Match... hmmmm irgendwas past da noch nicht.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread Reguläre Ausdrücke vorkompilieren: (Wie bekomme ich Parameter ans qr//?)