2016-01-29 4 views
5

Ich habe diese Unterroutine, die wieWas bedeuten Perl-Bezeichner, die mit einem Stern * beginnen?

definierte Bezeichner hat
*VALID_NAME_REG_EX = \"[ a-zA-Z0-9_#.:@=-]+"; 
*MACRO_VALID_NAME = \"MACRO_VALID_NAME"; 

ich in die Datei weiter aussah. Sie sind als $MACRO_VALID_NAME bezeichnet.

Ich denke, es ist der Wert mit der rechten Seite der Zeichenfolge ersetzen, aber ich bin mir nicht sicher und will eine Bestätigung.

+1

Mehr Informationen über konstante Variablen und Typeglobs können auch in Kapitel 7 in [Mastering Perl finden ] (http://shop.oreilly.com/product/0636920012702.do) und Kapitel 1.21 in [Perl Cookbook] (http://shop.oreilly.com/product/9780596003135.do) –

+0

Mögliche Duplikat von [Entmystifizierung der Perl glob (\ *)] (http://stackoverflow.com/questions/4865447/demystifying-the-perl-glob) – tripleee

Antwort

7
*VALID_NAME_REG_EX = \"[ a-zA-Z0-9_#.:@=-]+"; 

Die Wirkung ist dies zu sagen $VALID_NAME_REG_EX als Kennung für die Perl Stringliteral "[ a-zA-Z0-9_#.:@=-]+"

Dies unterscheidet zuweisen hat

$VALID_NAME_REG_EX = "[ a-zA-Z0-9_#.:@=-]+" 

welche Kopien die Zeichenkette in die Platz zugewiesen zu $VALID_NAME_REG_EX, damit es später geändert werden kann

Perl-Literale müssen nur lesbar sein, um einen Sinn zu ergeben, daher ist das Ergebnis der Zuweisung $VALID_NAME_REG_EX eine schreibgeschützte Variable, die auch als Konstante bezeichnet wird. Wenn Sie es versuchen, die Zuordnung wird eine Meldung so etwas wie

Modifikation eines Nur-Lese-Wert erhalten versucht

+1

kannte den schreibgeschützten Aspekt von typeglobs nie –

+2

@mattfreake: Es ist nicht der Typglob, der es lesen lässt - Nur, es ist dass es auf ein Perl-String-Literal zeigt, das von Natur aus nicht änderbar ist. Wenn ich '* var_b = \ $ var_a 'sage, dann habe ich' $ var_b' auf die gleiche Stelle wie '$ var_a' gesetzt, was lesend und schreibend ist – Borodin

3

* in perl bezeichnet ein typeglob

Perl einen internen Typen verwendet ein Typeglob bezeichnete einen ganzen Symboltabelleneintrag zu halten. Das Typpräfix eines typeglobs ist ein *, da es alle Typen darstellt. Dies war früher der bevorzugte Weg, Arrays und Hashes durch Referenz in eine Funktion zu übergeben, aber jetzt, da wir echte Referenzen haben, wird dies selten benötigt.

Der Haupteinsatz von typeglobs in modernen Perl ist das Erstellen von Symboltabellenaliasen. Diese Zuordnung:

*this = *that;

macht $this ein Alias ​​für $that, @this ein Alias ​​für @that, %this ein Alias ​​für %that, &this ein Alias ​​für &that usw. Viel sicherer ist es, eine Referenz zu verwenden.

Verwandte Themen