2009-06-04 4 views

Antwort

57

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.

+3

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

+8

@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. –

+2

Hinweis von 2016: Der '/ o' Modifikator wurde eingestellt. Weitere Informationen finden Sie unter [diese Frage] (http://stackoverflow.com/q/550258/477563). –

19

Einfach: Überprüfen Sie den Operator qr // (dokumentiert in perlop unter Regexp Quote-Like Operators).

+0

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

+0

@akostadinov Es ist noch vorkompiliert. –