Ich versuche, einen Perl-Code zu entschlüsseln, den ich nicht kenne, der irgendwie mit HashRef verwandt ist. Ich verwende Amazon :: S3, aber meine Frage ist eine allgemeine Perl-Frage. Siehe den folgenden Code:
%Vor%Dokumentation (hier) Sais, über s3- & gt; Eimer:
%Vor%Die folgende Zeile funktioniert für mich, aber ich verstehe nicht warum:
%Vor%Ich bin verwirrt von jedem Operator in der ersten Zeile.
Welcher Typ genau ist $response
, $respone->{bucket}
.
Sieht so aus, als wäre der Ausdruck in for
ein Array, aber ich verstehe diese Syntax nicht: @{ ... }
?
Lassen Sie uns Stück für Stück durchgehen.
$s3
ist Ihr S3-Objekt. $s3->buckets
ruft die Methode buckets
für dieses Objekt auf, und wir speichern die Ergebnisse in $response
. Wie die Dokumente sagen, sind die Ergebnisse eine Hash-Referenz; Eine Referenz ist ein Skalar, der auf einen anderen Wert zeigt. Wenn Sie mit Zeigern vertraut sind, ist die Idee die gleiche.
Wenn wir einen einfachen Hash %response
hätten, könnten wir den buckets
Schlüssel im Hash bekommen, indem wir $response{buckets}
sagen. Da wir eine Hash -Referenz haben, müssen wir den Dereferenzierungsoperator ( ->
) verwenden, um den Schlüssel zu erhalten, sodass $response->{buckets}
wird.
Aber wir sind noch nicht fertig. $response->{buckets}
ist selbst eine Referenz, in diesem Fall eine Array-Referenz. Hier sehen wir eine andere Form der Dereferenzierung. Wir könnten, wenn wir nur ein Element in dem referenzierten Array erhalten möchten, beispielsweise $response->{buckets}[0]
sagen. Aber wir wollen die ganze Liste, also verwenden wir den Operator @
, um das gesamte Array zu dereferenzieren. Da unsere Array-Referenz in einer komplexen Struktur enthalten ist, verwenden wir Curlies, um den Ausdruck zu enthalten, der die Referenz enthält. Also bekommt @{ $response->{buckets} }
das Array.
Das macht eine ganze Menge in einer einzigen Aussage.
Weitere Informationen zu Referenzen, die zu den schwierigsten Themen in Perl gehören können, finden Sie unter:
Willkommen in der Welt der Perl Referenzen! Sie werden das Referenz-Lernprogramm sehr nützlich finden.
Die Syntax @{...}
nimmt einen Skalarwert und versucht, sie in ein Array zu referenzieren. Es gibt auch %{...}
, das versucht, in einen Hash zu referenzieren. Die Curlies sind optional, du kannst also auch @$reference
oder %$reference
schreiben, um den gleichen Effekt zu erhalten. Manche Leute finden sie visuell nützlich, wenn sich die Referenz in einem Hash oder einem Array befindet, wie es hier der Fall ist.
Um Ihnen zu helfen, die Datenstruktur ein wenig mehr zu verstehen, versuchen Sie etwas wie Data :: Dumper.
%Vor%Sie können den Typ einer Variablen mit der Funktion ref () überprüfen.
@ {...} bedeutet "de-reference scalar ... as array". Also wenn du so gehst: my $ aref = ['a', 'b']; Der Zugriff auf @ {$ aref} liefert das Array ('a', 'b').
Ähnlich% {...} für Hash-Referenzen.
Siehe perlreftut für weitere Informationen.
Tags und Links perl