2010-11-13 20 views
21

ich zur Zeit über 'dereferencing' in Perl am Lernen und brauchen Ihre Hilfe zu verstehen, was die '\' bedeutet in der unten stehenden Zeile ..Was bedeutet '' in Perl?

$ra = \$a; 
+4

Wenn Sie derzeit darüber lernen, was sagen Sie Ihre Bücher und Handbücher? – Ether

+2

mein Vortrag Notizen nicht ausgearbeitet, was es bedeutet, führt mich auf Google zu suchen. fand nicht ein satis ans, also habe ich es hier gefragt. – Roy

+1

@Roy: stellen Sie sicher, dass Sie eine richtige Antwort wählen. ☹ – tchrist

Antwort

18

perlop See.

Unary "\" erstellt einen Verweis auf was auch immer folgt. Siehe perlreftut und perlref. Verwechseln Sie nicht dieses Verhalten mit dem Verhalten von Backslash innerhalb einer Zeichenfolge, obwohl beide Formen vermitteln den Begriff Schutz der nächsten Sache von Interpolation.

+4

Tatsächlich, oder erstellt mehrere Verweise auf die verschiedenen im Listenkontext folgenden Dinge * z. B. * '@r = \\ (@ a,% b, & c)' und '@r = \ localtime'. – tchrist

+0

Wenn es Backslash "\" in Regex oder in Zeichenfolge gibt, heißt es ESCAPE, sonst heißt es REFERENZ – jjpcondor

1

Erzeugt einen Verweis auf die Variable auf der rechten Seite; Art wie ein Zeiger in C (ohne die Zeigerarithmetik) oder ein Zeiger in Java.

Siehe perldoc perlref für viele weitere Informationen zu diesem Thema.

Dereferentiation über $$a für Skalare getan, @$a für Arrays etc.

+1

@tchrist Diese Antwort ist nicht falsch. Es sagt Ihnen nicht vollständig, was \ tut, aber die Frage war nicht "Was macht der \ Operator in allen Fällen", es war "was das \ 'in der Zeile darunter bedeutet". Die Zeile darunter war '$ ra = \ $ a;', und in dieser Zeile wird ein Verweis auf die Variable auf der rechten Seite erstellt. Die Antwort zeigt auch ein Referenzdokument, das den Operator vollständig erklärt. –

+0

@Chas. Owens: Es ist eine unvollständige Antwort auf den Titel dieser Frage. – tchrist

+0

Ach gut, ich denke in der Zeile '$ ra = \ $ a;' wird dann kein Verweis auf die Variable auf der rechten Seite erzeugt; P – mfontani

4

Die Perl-Dokumentation ist sehr gut und gründlich, es früh und häufig verwenden. Darf ich perldoc perlreftut, das Perl-Referenzen-Tutorial oder perldoc perlref für mehr empfehlen. Danach perldoc perlintro und perldoc perltoc oder perldoc perl um zu sehen, wohin Sie von dort gehen.

Und ja, es erstellt einen Verweis auf die Variable $ a und speichert es in der Variablen $ ra.

24

Wie ich an anderer Stelle bereits geschrieben haben ...

Unary \ erzeugt einen Verweis auf das, was folgt. Wird in einer Liste verwendet, erstellt es eine Liste von Referenzen.

Verwechseln Sie dieses Verhalten nicht mit dem Verhalten von Backslash innerhalb einer Zeichenfolge, obwohl beide Formen die vage negationale Vorstellung vermitteln, das nächste Ding vor der Interpretation zu schützen. Diese Ähnlichkeit ist nicht völlig zufällig.

Sie können einen Verweis auf jede benannte Variable oder Unterroutine mit einem umgekehrten Schrägstrich erstellen. Sie können es auch für einen anonymen skalaren Wert wie 7 oder "camel" verwenden, obwohl Sie dies nicht oft tun müssen. Dieser Operator funktioniert wie der & (Adressen-) Operator in C oder C - zumindest auf den ersten Blick.

Hier sind einige Beispiele:

$scalarref = \$foo; 
$constref = \186_282.42; 
$arrayref = \@ARGV; 
$hashref = \%ENV; 
$coderef = \&handler; 
$globref = \*STDOUT; 

Der Backslash Operator kann mehr als eine einzelne Referenz zu erzeugen. Es erzeugt eine ganze Liste von Referenzen, wenn es auf eine Liste angewendet wird.

Wie bereits erwähnt, wird der Backslash-Operator normalerweise für einen einzelnen Referenten verwendet, um einen einzelnen Verweis zu generieren, muss aber nicht. Wenn es in einer Liste von Referenten verwendet wird, erzeugt es eine Liste von entsprechenden Referenzen. Die zweite Zeile des folgenden Beispiels funktioniert genauso wie die erste Zeile, da der umgekehrte Schrägstrich automatisch in der gesamten Liste verteilt wird.

@reflist = (\$s, \@a, \%h, \&f);  # List of four references 
@reflist = \($s, @a %h, &f);  # Same thing 

Wenn ein klammerten Liste genau ein Array oder Hash enthält, werden alle seine Werte werden interpoliert, und Verweise auf die jeweils zurück:

@reflist = \(@x);     # Interpolate array, then get refs 
@reflist = map { \$_ } @x;   # Same thing 

Dies tritt auch auf, wenn es interne Klammern:

@reflist = \(@x, (@y));    # But only single aggregates expand 
@reflist = (\@x, map { \$_ } @y); # Same thing 

Wenn Sie dies mit einem Hash versuchen, enthält das Ergebnis Verweise auf die Werte (wie Sie erwarten würden), aber Verweise auf Kopien der Schlüssel (wie Sie vielleicht nicht erwarten).

Da Array- und Hash-Slices eigentlich nur Listen sind, können Sie einen Teilstrich mit einem Backslash versehen, um eine Liste mit Referenzen zu erhalten. Jede der nächsten vier Zeilen tut genau das Gleiche:

@envrefs = \@ENV{"HOME", "TERM"};   # Backslashing a slice 
@envrefs = \@ENV{ qw<HOME TERM> };  # Backslashing a slice 
@envrefs = \($ENV{HOME}, $ENV{TERM}); # Backslashing a list 
@envrefs = (\$ENV{HOME}, \$ENV{TERM}); # A list of two references 

Da Funktionen können Listen zurückkehren, können Sie einen umgekehrten Schrägstrich für sie gelten. Wenn Sie mehr als eine Funktion aufrufen müssen, interpolieren erste jeweiligen Rückgabewerte der Funktion in eine größere Liste und dann die ganze Sache Rückschlag:

@reflist = \fx(); 
@reflist = map { \$_ } fx();    # Same thing 

@reflist = \(fx(), fy(), fz()); 
@reflist = (\fx(), \fy(), \fz());   # Same thing 
@reflist = map { \$_ } fx(), fy(), fz(); # Same thing 

Der Backslash Operator immer eine Liste Kontext seiner Operanden liefert, so dass diese Funktionen sind Alle im Listenkontext aufgerufen. Wenn der Backslash selbst in Skalarkontext ist, werden Sie mit einem Verweis auf den letzten Wert der Liste von der Funktion zurückgegeben am Ende:

@reflist = \localtime();  # Ref to each of nine time elements 
$lastref = \localtime();  # Ref to whether it’s daylight savings time 

In dieser Hinsicht verhält sich der Backslash wie die Liste Perl genannt Operatoren wie print, reverse und sort, die immer einen Listenkontext auf ihrer rechten Seite liefern, egal was auf der linken Seite passiert. Wie bei benannte Liste Operatoren, eine explizite scalar Gewalt anwenden, was in Skalarkontext folgt:

$dateref = \scalar localtime(); # \"Sat Nov 13 10:41:30 2010" 

Und jetzt wissen Sie ... die Rest der Geschichte.

(mit Entschuldigungen zum späten Paul Harvey)

+2

Ich habe gerade einen Verweis auf DATA mit \\ * DATA benutzt, um den zu benutzen Template :: Toolkit mit LaTeX. Ich habe den LaTeX-Abschnitt in den DATA-Abschnitt eingefügt und dann den Verweis darauf als Vorlage in 'process' verwendet: Perl ist so cool. –

+2

Auch danke für das zeigen, dass \\ (...) verteilt, Erstellen eines Verweises auf jedes Element. Ich hätte gedacht, dass das ein Verweis auf das Array dieser Liste sein würde, aber jetzt macht das Sinn, sonst brauchen wir [...] dafür. Danke –

+1

das ist wirklich umfassend, das ist tchrist. – Roy