2016-09-19 2 views
2

Welche Funktion haben die Doppelpunkte in diesem Perl-Regex, die ich in einem Produktionscode gefunden habe?Was bedeutet es, wenn eine Regex durch Doppelpunkte begrenzt wird?

Der Code analysiert einen URI und die zweite Zeile verwendet die erfasste Gruppe.

+0

, indem ein 'm' vor der Tür, um beliebige Trennzeichen geändert werden Sprechen Sie über Perl 6 oder Perl 5? Perl 5 hat keine Adverbien. – ThisSuitIsBlackNot

+2

Pedanterweise gibt es in Ihrer Regex keine Doppelpunkte. Die Regex ist das Bit zwischen den Doppelpunkten - '/ copy/(\ d +)'. Die Doppelpunkte sind das Trennzeichen für den Übereinstimmungsoperator ('m /.../'), der hier als 'm: ..:' geschrieben wird, um zu vermeiden, dass die Zeichen '/' in der Regex nicht gefunden werden müssen. –

+0

* "Ich weiß, dass sie verwendet werden, um Adverbien zu begrenzen" * Meinst du das in Englisch, oder wirst du mit Perl 6 verwirrt? Perl 5 hat nichts als * Adverbien *. – Borodin

Antwort

6

Nach dem m, ein beliebiges Zeichen kann als Trennzeichen dienen, also ersetzen die Doppelpunkte den Standard / s und lassen sie zu einem normalen Zeichen werden.

Von perlrequick:

die // Standard-Trennzeichen für ein Spiel können

10

Der Operator m in Perl wird verwendet, um eine Zeichenfolge anhand eines regulären Ausdrucks zu testen. Sie verwenden es in der Regel wie folgt aus:

"string" =~ m/regex/ 

Wenn Sie wollen, können Sie das unter Angabe Zeichen ändern (/ in dem obigen Beispiel). So kann das obige Beispiel äquivalent als eine der folgenden Aktionen geschrieben werden:

"string" =~ m(regex) 
"string" =~ m[regex] 
"string" =~ m{regex} 
"string" =~ m|regex| 
"string" =~ m:regex: 

Beachten Sie, dass, wenn Sie / verwenden, dann können Sie die m weglassen, wie in

"string" =~ /regex/ 
+0

Beachten Sie, dass die Verwendung von '|' (oder einem anderen Metazeichen für diese Angelegenheit) als Trennzeichen * nicht * die beste Idee ist ;-) –

+0

@LucasTrzesniewski Guter Punkt. – redneb

+0

Fwiw - das Rätsel der Verwendung von Metazeichen als Trennzeichen wird nur dann angezeigt, wenn der Rumpf des Ausdrucks versucht, es als Literal abzugleichen. Die Engine erwartet das Metazeichen mit Escape-Zeichen und der Parser erwartet (ebenfalls) ein Escapezeichen. Raw '(?: A | B) \ |' abgegrenzt 'm | (?: A \ | B) \ ||' then '(?: A | B) |' wird an die Engine gesendet. Oder, falls abgegrenzt 'm | (?: A \ | B) \\ ||' dann wird es einen Analysefehler geben, weil m '| (?: A \ | B) \\ | '| wird nur begrenzt und hinterlässt ein '|'. Es ist besser, einen Nicht-Metachar zu wählen, oder einen, der kein Kontext ist wie '{} {}' – sln

Verwandte Themen