Welche Zeichen sind in Perl-Bezeichnern zulässig?

7

Ich arbeite an regulären Hausaufgaben, wo eine Frage ist:

  

Verwenden Sie Online-Sprachreferenzhandbücher, um die regulären Ausdrücke für ganzzahlige numerische Konstanten und Bezeichner für Java, Python, Perl und C zu bestimmen.

Ich brauche keine Hilfe beim regulären Ausdruck, ich habe einfach keine Ahnung, wie Bezeichner in Perl aussehen. Ich habe Seiten gefunden, die gültige Bezeichner für C , Python und Java , aber ich kann nichts über Perl finden.

BEARBEITEN: Um zu verdeutlichen, sollte die Suche nach der Dokumentation einfach sein (z. B. eine Google-Suche nach Python-IDs ). Ich nehme keine Klasse in "Google-Suchen".

    
Brendan Long 26.01.2011, 00:10
quelle

4 Antworten

29

Perl-Ganzzahlkonstanten

Integer-Konstanten in Perl können

sein
  • in Basis 16, wenn sie mit ^0x beginnen
  • in Basis 2, wenn sie mit ^0b beginnen
  • in Basis 8, wenn sie mit 0 beginnen
  • sonst sind sie in der Basis 10.

Diesem Anführer folgt eine beliebige Anzahl gültiger Ziffern in dieser Basis und optional auch Unterstriche .

Beachten Sie, dass die Ziffer nicht \p{POSIX_Digit} bedeutet; es bedeutet \p{Decimal_Number} , das ist wirklich ziemlich anders, weißt du.

Bitte beachten Sie, dass ein vorangestelltes Minuszeichen nicht Teil der Integer-Konstante ist, was leicht bewiesen werden kann durch:

%Vor%

Sehen Sie die 3 const und viel später den negate Op-Code? Das sagt Ihnen einen Haufen, einschließlich einer Kuriosität des Vorrangs.

Perl Identifier

Identifizierer, die über symbolische Dereferenzierung spezifiziert wurden, haben keinerlei Einschränkungen für ihre Namen.

  • Zum Beispiel ruft 100->(200) die Funktion 100 mit den Referenzen (100, 200) auf.
  • Zum anderen bezieht sich ${"What’s up, doc?"} auf die skalare Paketvariable mit diesem Namen im aktuellen Paket.
  • Andererseits bezieht sich ${"What's up, doc?"} auf die skalare Paketvariable, deren Name ${"s up, doc?"} ist und die nicht im aktuellen Paket ist, sondern im What -Paket. Nun, es sei denn, das aktuelle Paket ist natürlich das Paket What . Similary $Who's ist die Variable $s im Paket Who .

Man kann auch Bezeichner der Form ${^ Bezeichner } ; Diese werden nicht als symbolische Dereferenzierung in die Symboltabelle angesehen.

Bezeichner mit nur einem einzelnen Zeichen können ein Interpunktionszeichen sein, einschließlich $$ oder %! .

Identifizierer können auch die Form $^C haben, die entweder ein Steuerzeichen oder ein Zirkumflex ist, gefolgt von einem Nicht-Steuerzeichen.

Wenn keines dieser Dinge wahr ist, folgt ein (nicht vollständig qualifizierter) Bezeichner den Unicode-Regeln für Zeichen mit den Eigenschaften ID_Start gefolgt von denen mit der Eigenschaft ID_Continue . Es überschreibt dies jedoch, indem es all-digit Bezeichnern und Bezeichnern erlaubt, die mit einem Unterstrich beginnen (und vielleicht nichts anderes mehr haben). Sie können im Allgemeinen so tun (aber es ist wirklich nur das Vortäuschen), dass das ist, wie \w+ zu sagen, wobei \w wie in Anhang C der UTS # 18 . Das heißt, alles, was eines davon hat:

  • die alphabetische Eigenschaft - die weit mehr enthält als nur Buchstaben; Es enthält auch verschiedene Kombinationszeichen und die Letter_Number-Codepunkte sowie die eingekreisten Buchstaben
  • die Decimal_Number-Eigenschaft, die mehr als nur [0-9] ist
  • Alle Zeichen mit der Mark-Eigenschaft, nicht nur die Zeichen, die als Other_Alphabetic
  • gelten
  • Alle Zeichen mit der Connector_Puncutation-Eigenschaft, deren Unterstrich nur eine solche ist.

Also entweder ^\d+$ oder sonst

%Vor%

sollte es für die wirklich einfachen tun, wenn Sie nicht die Komplexität der Unicode ID_Start und ID_Continue Eigenschaften erkunden wollen. So ist es wirklich gemacht, aber ich wette, dein Lehrer weiß das nicht. Vielleicht soll man es ihm nicht sagen, wie?

Aber Sie sollten die nicht einfachen, die ich früher beschrieben habe, abdecken.

Und wir haben noch nicht über Pakete gesprochen.

Perl-Pakete in Identifikatoren

Abgesehen von diesen einfachen Regeln müssen Sie auch berücksichtigen, dass Bezeichner mit einem Paketnamen qualifiziert werden können, und die Paketnamen selbst folgen den Regeln der Bezeichner.

Das Paket-Trennzeichen ist entweder :: oder ' nach Belieben.

Sie müssen kein Paket angeben, wenn es sich um die erste Komponente in einem vollständig qualifizierten Bezeichner handelt. In diesem Fall bedeutet dies das Paket main . Das bedeutet, dass Dinge wie $::foo und $'foo äquivalent zu $main::foo sind, und isn't_it() entspricht isn::t_it() . (Tippfehler entfernt)

Schließlich ist als Sonderfall ein abschließender doppelter Doppelpunkt (aber kein einfaches Anführungszeichen) am Ende eines Hash erlaubt, und dies bezieht sich dann auf die Symboltabelle dieses Namens.

Somit ist %main:: die main Symboltabelle, und weil Sie main weglassen können, ist auch %:: .

Mittlerweile ist %foo:: die foo Symboltabelle, ebenso wie %main::foo:: und auch %::foo:: , nur um der Perversität willen.

Zusammenfassung

Es ist schön zu sehen, dass Ausbilder Menschen nicht-triviale Aufgaben geben. Die Frage ist, ob der Ausbilder erkannte, dass es nicht trivial war. Wahrscheinlich nicht.

Und es ist auch kaum nur Perl. Haben Sie bei den Java-Identifikatoren herausgefunden, dass die Lehrbücher noch liegen? Hier ist die Demo:

%Vor%

Ja, es ist wahr. Dies gilt auch für viele andere Codepunkte, insbesondere wenn Sie -encoding UTF-8 in der Kompilierzeile verwenden.Ihre Aufgabe ist es, das Muster zu finden, das diese erschreckend unerbittlichen Java-Identifikatoren beschreibt. Hinweis: Stellen Sie sicher, dass der Codepunkt U + 0000 enthalten ist.

Bist du nicht froh, dass du gefragt hast? Hoffe das hilft. Oder so. ☺

    
tchrist 26.01.2011, 01:44
quelle
5

Die Hausaufgabe verlangt, dass Sie die Referenzhandbücher verwenden, also werde ich in diesen Begriffen antworten.

Die Perl-Dokumentation ist verfügbar unter Ссылка . Der Abschnitt, der sich mit Variablen beschäftigt, ist perldata. Das wird Ihnen leicht eine brauchbare Antwort geben.

In Wirklichkeit bezweifle ich, dass die vollständige Antwort in der Dokumentation verfügbar ist. Es gibt spezielle Variablen (siehe perlvar) und "utf8;" kann die Definition von "Buchstaben" und "Zahl" stark beeinflussen.

%Vor%

[Ich habe nur den Bezeichner Teil abgedeckt. Ich habe gerade bemerkt, dass die Frage größer ist als das]

    
ikegami 26.01.2011 00:18
quelle
5

Die perlvar-Seite der Perl-Dokumentation hat einen Abschnitt am Ende grob skizziert die zulässige Syntax. Zusammenfassend:

  1. Beliebige Kombination aus Buchstaben, Ziffern, Unterstrichen und der Sondersequenz :: (oder ' ), sofern sie mit einem Buchstaben oder Unterstrich beginnt.
  2. Eine Ziffernfolge.
  3. Ein einzelnes Interpunktionszeichen.
  4. Ein einzelnes Steuerzeichen, das auch als Caret-Brief geschrieben werden kann, z. ^W .
  5. Eine alphanumerische Zeichenfolge, die mit einem Steuerzeichen beginnt.

Beachten Sie, dass die meisten anderen Kennungen als die in Gruppe 1 von Perl eine besondere Bedeutung erhalten oder reserviert sind und in späteren Versionen eine besondere Bedeutung erhalten. Aber wenn Sie nur versuchen herauszufinden, was ein gültiger Bezeichner ist, dann ist das in Ihrem Fall nicht wirklich wichtig.

    
Anon. 26.01.2011 00:19
quelle
1

Wenn Sie keine offizielle Spezifikation haben (Perl ist was auch immer der Perl-Interpreter parsen kann), kann das ein wenig schwierig zu erkennen sein.

Diese Seite enthält Beispiele für alle Ganzzahlkonstantenformate. Das Format der Bezeichner muss von verschiedenen Seiten in perldoc abgeleitet werden.

    
OrangeDog 26.01.2011 00:17
quelle

Tags und Links