Gibt es eine Möglichkeit, eine Regex in Perl vorzukompilieren? Ich habe eine, die ich oft in einem Programm verwende und es ändert sich nicht zwischen den Anwendungen.Gibt es eine Möglichkeit, eine Regex in Perl vorzukompilieren?
Antwort
Für literale (statische) Regexes gibt es nichts zu tun - Perl kompiliert sie nur einmal.
if ($var =~ /foo|bar/) {
# ...
}
Für Regexe, die in Variablen gespeichert sind, haben Sie ein paar Optionen. Sie können die qr//
Operator ein Regex-Objekt zu erstellen:
my $re = qr/foo|bar/;
if ($var =~ $re) {
# ...
}
Dies ist praktisch, wenn Sie einen regulären Ausdruck an mehreren Stellen verwenden möchten oder es zu Subroutinen übergeben.
Wenn die RegexMuster in einem String ist, können Sie die /o
Option verwenden Perl versprechen, dass es nie ändern:
my $pattern = 'foo|bar';
if ($var =~ /$pattern/o) {
# ...
}
Es ist in der Regel besser nicht zu tun, wenn. Perl ist schlau genug, um zu wissen, dass sich die Variable nicht geändert hat und die Regex nicht neu kompiliert werden muss. Die Angabe /o
ist wahrscheinlich eine vorzeitige Mikrooptimierung. Es ist auch eine potentielle Falle. Wenn die Variable geändert mit /o
hat, würde Perl den alten Regex trotzdem verwenden. Das könnte zu schwer zu diagnostizierenden Fehlern führen.
Einfach: Überprüfen Sie den Operator qr // (dokumentiert in perlop unter Regexp Quote-Like Operators).
schön, es scheint, dass kann als ein Muster in der s /// Konstrukt verwendet werden. Ist es noch vorkompiliert oder wird es in diesem Fall erneut kompiliert? – akostadinov
@akostadinov Es ist noch vorkompiliert. –
Diese sind wahr; qr // wird jedoch seit vielen Jahren unterstützt (es existiert seit 5.005, und ich denke, es gab seit 5.8 keine Probleme mehr) – ephemient
@ephemient Nun, 5.10 hat ein unangenehmes Speicherleck, das mit qr // (und dem Kompilieren von Regexen) verbunden ist im Allgemeinen), aber das wurde behoben. Wenn Sie 5.10 verwenden, können Sie überprüfen, ob Sie einen Speicherleck haben, indem Sie perl -e 'qr // while 1' angeben. Ich weiß, dass die OS X-Version von ActiveState Perl 5.10 immer noch defekt ist. –
Hinweis von 2016: Der '/ o' Modifikator wurde eingestellt. Weitere Informationen finden Sie unter [diese Frage] (http://stackoverflow.com/q/550258/477563). –