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. –
- 1. Gibt es eine Möglichkeit, den Regex-Bindeoperator `= ~` in Perl zu überladen?
- 2. Perl Spott gibt es eine Möglichkeit, $ zu verspotten?
- 3. Perl: Gibt es eine Möglichkeit, nur die letzte Regex-Übereinstimmung zu teilen?
- 4. Gibt es eine Möglichkeit, diese beiden Regex zusammenzuführen?
- 5. Gibt es eine Möglichkeit, eine CABasicAnimation anzuhalten?
- 6. Gibt es eine Regex Delete in Ruby?
- 7. Ist es möglich, jsp in Eclipse vorzukompilieren?
- 8. gibt es eine Möglichkeit, eine Liste der gültigen Locales in meinem Linux mit Perl zu finden?
- 9. Gibt es eine Perl-Implementierung von SHA256withRSA
- 10. Gibt es eine Möglichkeit, assoziative Arrays in REXX zu tun?
- 11. Gibt es eine elegante Möglichkeit, Teilregex-Matches in Java durchzuführen?
- 12. Gibt es eine Möglichkeit, eine Aufnahme beliebig oft in einem Regex zu wiederholen?
- 13. Gibt es eine Möglichkeit, in java matcher regex nur eine erfasste Gruppe zu ersetzen?
- 14. Gibt es eine Möglichkeit, einen String in Flex zu forma
- 15. gibt es eine Möglichkeit, Importe in Java-Quelldatei neu anordnen
- 16. Gibt es eine Möglichkeit, eine MySQL-Datenbank für Änderungen mit Perl zu beobachten?
- 17. Gibt es eine Möglichkeit, eine "Zelle" in MigLayout einzufügen?
- 18. Gibt es eine Möglichkeit, eine Eigenschaft nur einmal in C#
- 19. Gibt es eine Möglichkeit, eine Testdatenbank in Katalysator zu verwenden?
- 20. Gibt es eine einfache Möglichkeit, eine Tabelle in Prozedur umzubenennen?
- 21. Gibt es eine Möglichkeit, eine Funktion in jQuery zu deaktivieren?
- 22. Gibt es eine Möglichkeit, eine NSCollectionView in Swift programmgesteuert einzurichten?
- 23. Gibt es eine Möglichkeit, eine PopUpWindow in Silverlight
- 24. Gibt es eine Möglichkeit, eine Datei in Subversion zu "kleben"?
- 25. Gibt es eine Möglichkeit, eine zirkuläre Bitverschiebung in C# durchzuführen?
- 26. Gibt es eine Möglichkeit, Quellcode wieder in eine CodeCompileUnit umzuwandeln?
- 27. Gibt es eine Möglichkeit automatisch eine #define in jeder Quelldatei
- 28. Gibt es eine Möglichkeit, eine Bibliotheksmethode in IntelliJ "abzulehnen"?
- 29. Gibt es eine Möglichkeit, eine Variable in LaTeX zu definieren?
- 30. Gibt es eine Möglichkeit, eine Zeichenfolge in Node.js regexp-Anführungszeichen?
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). –