2014-03-24 20 views
19

Das scheint etwas zu sein, das ich leicht Google, Bing oder DDG erreichen könnte, aber ich komme völlig leer auf alles.

Grundsätzlich bin ich damit beauftragt (teilweise) eine Reihe alter Perl-Skripte neu zu schreiben. Nicht in der ein Perl-Programmierer selbst, es ist definitiv eine Lernkurve dieser Skripte in Lesen, um herauszufinden, was sie tun, aber ich habe eine absolute Mauer mit Linien getroffen wie diese:

$comment = $$LOC{'DESCRIPTION'}; 

nahe, wie ich kann sagen, dass die rechte Seite ein Wörterbuch ist, oder genauer gesagt, es erhält den Wert, der durch den Schlüssel 'DESCRIPTION' in dem Wörterbuch referenziert wird. Aber was ist mit dem "extra" Dollarzeichen davor?

Es sieht verdächtig nach PHP variable variables, aber nach Suchmaschinen Scheuern, verschiedene Stack Sites und perlvar, kann ich keine Hinweise finden, die Perl selbst hat ein solches Feature, geschweige denn, dass dies, wie es aufgerufen. Das Beste, was ich herausgefunden habe, ist, dass '$' kein gültiges Zeichen in einem Variablennamen ist. Daher weiß ich, dass $$LOC nicht einfach nur eine Variable aufruft, die zufällig $LOC heißt.

Was macht dieses extra Dollarzeichen hier?

+4

Siehe [Referenzen schnelle Referenz] (http://www.perlmonks.org/?node_id=69927) auf PerlMonks. – ThisSuitIsBlackNot

Antwort

26

Dies ist eine alternative Form der Dereferenzierung. Könnte (und ehrlich wahrscheinlich sollte) geschrieben werden als:

my $str = 'a string'; 
my %hash = (a => 1, b => 2); 
my @array = (1..4); 

my $strref = \$str; 
my $hashref = \%hash; 
my $arrayref = \@array; 

print "String value is $$strref\n"; 
print "Hash values are either $$hashref{a} or $hashref->{b}\n"; 
print "Array values are accessed by either $$arrayref[0] or $arrayref->[2]\n"; 
+0

Danke! Was ist der Unterschied zwischen dem, und sagen wir das: '$ script = $ DEFAULT {SCRIPT};' (was interessanterweise ist die nächste Zeile in dem Skript, das ich mir ansehe)? Das gleiche, aber ohne (anscheinend sowieso) Dereferenzierung? Ist das ein logischer Fehler (vorausgesetzt natürlich, dass der Inhalt des Wörterbuchs gewünscht ist)? – Kromey

+2

Wenn Sie auf ein ganzes Array zugreifen möchten, verwenden Sie '@ array'. Oder ein ganzer Hash, benutze '% hash'. Um jedoch auf ein Element eines Arrays oder Hash zuzugreifen, müssen Sie '$ array [3]' oder '$ hash {key}' verwenden. In dieser nächsten Zeile ist '% DEFAULT' ein einfacher Hash und' SCRIPT' ist ein Schlüssel dieses Hashs, dessen Wert $ script zugewiesen wird. – Miller

+0

Okay, jetzt bin ich zurück, um das ursprüngliche Bit nicht zu verstehen, weil ich dachte, dass wir das dort gemacht haben. Ich denke, ich muss nur mit einem "Perl 101" Buch oder so etwas ... – Kromey

0

Dereferenzierung ist die Behandlung eine skalare als ‚Adresse‘ an:

$LOC->{'DESCRIPTION'}; 

Sie manchmal das gleiche mit anderen alle grundlegenden Datentypen erhältlich Hier können Sie eine andere Variable (Skalar, Array oder Hash) und ihren Wert finden.

In diesem Fall wird $ LOC {DESCRIPTION} als die Adresse eines anderen Skalars interpretiert, der in $ comment gelesen wird.

In Perl

my $str = 'some val'; 
my $ref = \$str; 
my $val = ${$ref}; 
my $same_val = $$ref; 
+0

Das ist sehr falsch. Es gibt einen großen Unterschied zwischen einer * Referenz * und einer * Speicheradresse *. Perl ist nicht C und es gibt keine Möglichkeit, eine Variable aufgrund ihrer Speicherposition abzurufen.Sie können jedoch eine * Referenz * auf eine beliebige Perl-Variable mit dem Backslash-Operator '\' nehmen, und diese Referenz kann in jeder skalaren Perl-Variablen gespeichert werden. Auf die ursprüngliche Variable kann durch Dereferenzierung * irgendein Verweis darauf zugegriffen werden. – Borodin

+0

Ich wollte die Adressmetapher verwenden, weil ich dachte, es wäre hilfreich; Das OP schien im Nachhinein unklar zu sein, wofür es Referenzen gibt. Aber Sie haben Recht, es ist keine Speicheradresse. Ich denke, es ist buchstäblich eine Kopie des Hash-Schlüssels zu einem Definitions-Wörterbucheintrag? Bearbeitete meine Antwort. – froodley