Gibt es eine bessere Möglichkeit, Perl-Ausdrücke mit / x zu schreiben, damit der Code immer noch leicht zu lesen ist?

8

Ich habe Perl :: Critic in einem meiner Skripte ausgeführt und folgende Nachricht erhalten:

%Vor%

Ich habe die Richtlinieninformationen hier , und ich verstehe, dass das Schreiben regulärer Ausdrücke im erweiterten Modus jedem hilft, der sich den Code ansieht.

Ich bin jedoch fest, wie ich meinen Code konvertieren soll, um das / x-Flag zu verwenden.

CPAN Beispiel:

%Vor%

Dies ist sinnvoll, wenn Sie nur die Regex betrachten.

Mein Code:

%Vor%

Ich bin mir nicht sicher, wie ich einen erweiterten Regex innerhalb einer if-Anweisung verwenden soll. Ich kann es so schreiben:

%Vor%

Und das funktioniert, aber ich denke, das ist fast schwieriger zu lesen als das Original. Gibt es einen besseren Weg (oder einen Best-Practice-Weg), dies zu schreiben? Ich schätze, ich könnte eine Variable mit qr //.

erstellen

Ich bin nicht wirklich auf der Suche nach Ratschlägen zum Umschreiben dieser spezifischen Regex (obwohl, wenn ich es verbessern kann, werde ich Rat nehmen) - Ich bin mehr auf der Suche nach Rat, wie eine Regex in einem If zu erweitern Aussage.

Ich kenne Perl :: Critic ist nur eine Richtlinie, aber es wäre nett, ihr zu folgen.

Vielen Dank im Voraus!

BEARBEITEN: Nachdem ich einige Antworten erhalten hatte, wurde mir klar, dass es nicht immer notwendig ist, eine Regex-Mehrfachzeile mit Kommentaren zu erstellen. Leute, die grundlegende Regex verstehen, sollten in der Lage sein zu verstehen, was mein Beispiel tat - die Kommentare, die ich hinzufügte, waren vielleicht ein wenig unnötig und ausführlich. Ich mag die Idee, die erweiterte Regex-Flagge zu verwenden, aber immer noch Leerzeichen in die Regex einzubetten, um jeden Teil der Regex ein wenig klarer zu machen. Danke für alle Eingaben!

    
BrianH 12.06.2009, 15:48
quelle

5 Antworten

11

Nun, ich glaube wirklich nicht, dass Sie vertikale Bildschirm-Immobilien damit verschwenden sollten. Auf der anderen Seite, wenn ich dieses Muster über mehrere Zeilen schreiben würde, hätte ich geschweifte Klammern verwendet und das Muster eingerückt:

%Vor%

IMHO, die folgende Version ist völlig in Ordnung:

%Vor%

in Bezug auf den Nutzen von m//x .

Die Kommentare sind in diesem Fall völlig unnötig, weil Sie nichts Schwieriges tun. Ich habe \s* vor dem Semikolon hinzugefügt, weil manchmal Leute das Semikolon von dem Paketnamen unterscheiden und das sollte Ihre Übereinstimmung nicht abwerfen.

    
Sinan Ünür 12.06.2009, 16:00
quelle
11

Schreiben Sie niemals einen Kommentar, der sagt, was der Code sagt. Kommentare sollten Ihnen sagen, warum der Code sagt, was er sagt. Sieh dir diese Monstrosität an, ohne die Kommentare ist es sehr schwierig zu sehen, was vor sich geht, aber die Kommentare machen deutlich, was versucht zu sein:

%Vor%     
Chas. Owens 12.06.2009 16:51
quelle
8

Es ist Ihr Ruf, was den Mehrwert dieser zusätzlichen Informationen angeht.

Manchmal hast du Recht, es fügt nichts hinzu, um zu erklären, was vor sich geht und macht den Code nur unordentlich, aber für komplexe reguläre Ausdrücke kann das x -Flag ein Segen sein.

Tatsächlich kann das "Tätigen eines Anrufs" bezüglich des Mehrwerts zusätzlicher Informationen ziemlich schwierig sein.

Ich kann mich nicht erinnern, wie oft ich Legacy-Code gesehen habe, wo schön formatierte Kommentare nicht gepflegt wurden und so von dem, was der Code macht, wegdriften. In der Tat, als ich viel weniger erfahren war, ging ich völlig den falschen Weg, weil ein mit einem Code verbundener Kommentar alt war und nicht gepflegt wurde.

Bearbeiten: In gewisser Weise ist das CPAN-Beispiel nicht wirklich nützlich. Wenn ich das x-Flag verwende, um Kommentare hinzuzufügen, um eine komplexe Regexp zu beschreiben, tendiere ich dazu, die Komponenten zu beschreiben, die die Regexp zu vergleichen versucht, anstatt einfach nur die regexp- "Bits" zu beschreiben. Zum Beispiel würde ich Dinge schreiben wie:

  • die erste Komponente (Gebiet und Distrikt) der britischen Postleitzahl oder
  • die internationale Vorwahl für Großbritannien oder
  • jede britische Handynummer.

was mir mehr sagt als

  • ein oder zwei Buchstaben, gefolgt von einer Zahl, optional gefolgt von einem Buchstaben oder
  • zwei vier Ziffern zusammen oder
  • eine Null, gefolgt von vier Dezimalziffern, einem Strich und dann sechs Dezimalziffern.

Mein Gefühl wäre, die Regexp-Kommentare in diesem Fall auszulassen. Dein Bauchgefühl stimmt!

    
Rob Wells 12.06.2009 16:02
quelle
6

Wenn in diesem Thema alternative Methoden zum Schreiben regulärer Ausdrücke behandelt werden, gibt es Möglichkeiten, komplizierte reguläre Ausdrücke ohne Variablen und ohne Kommentare zu schreiben, und sie sind immer noch nützlich.

Ich ließ Chas Owens die Regex-Gültigkeitsprüfung auf das in Perl-5.10 verfügbare neue deklarative Formular zurückführen, das zahlreiche Vorteile bietet.

  • Token in der Regex sind wiederverwendbar
  • Wer später die Regex druckt, sieht immer noch den gesamten Logikbaum.

Es ist vielleicht nicht jedermanns Sache, aber für extrem komplexe Dinge wie Datumsüberprüfung kann es praktisch sein (ps: in der realen Welt, bitte verwenden Sie ein Modul für Datum Sachen, nicht DIY, das ist nur ein Beispiel um von zu lernen)

%Vor%

Beachten Sie das Hinzufügen der (?!\d) Snippets, die so hinzugefügt werden, dass

"45" stimmt nicht mit ~= m{(?&twentyeightdays) $syntax} überein, weil '4' mit 0 übereinstimmt [4]

    
Kent Fredric 12.06.2009 20:23
quelle
1

Scheint so, als ob das eher eine Frage ist, wie man eine mehrzeilige "if Condition", bei der es sehr viele Antworten gibt, konsequent einrücken lässt. Was wirklich zählt, ist Konsistenz. Wenn du perltidy oder einen anderen Formatierer verwendest, sei konsistent mit dem, was dabei herauskommt (mit deiner Konfiguration). Ich würde jedoch den Inhalt der Regex eine Ebene von den Begrenzern einrücken.

Ihr Beitrag zeigt einen großen Fehler bei der Ausführung von bestehendem Code durch etwas wie Perl :: Critic - Sie das CPAN-Beispiel, das a * aus der ursprünglichen Regex weggelassen wurde. Wenn Sie viel "bereinigen", können Sie damit rechnen, Bugs einzuführen, also hoffe ich, dass Sie eine gute Testsuite haben.

    
ysth 12.06.2009 16:03
quelle

Tags und Links