Ich sende ein Unterprogramm einen Hash und hole es mit my($arg_ref) = @_;
Aber was genau ist %$arg_ref
? Ist %$
dereferenziert den Hash?
$arg_ref
ist ein Skalar, da das $
sigil verwendet wird. Vermutlich enthält es eine Hash-Referenz. Also ja, %$arg_ref
referenziert diese Hash-Referenz. Eine andere Möglichkeit, es zu schreiben ist %{$arg_ref}
. Dies macht die Absicht des Codes ein wenig klarer, obwohl ausführlicher.
Um aus perldata(1)
zu zitieren:
Also wäre Ihr Beispiel:
%Vor% my($arg_ref) = @_;
ergreift das erste Element im Argumentstack der Funktion und speichert es in einer lokalen Variablen namens $arg_ref
. Der Aufrufer ist dafür verantwortlich, eine Hash-Referenz zu übergeben. Eine kanonischere Art zu schreiben ist:
Um einen Hash-Verweis zu erstellen, könnten Sie mit einem Hash beginnen:
%Vor%Oder Sie können es mit einer anonymen Hash-Referenz erstellen:
%Vor%Anstatt den gesamten Hash zu demeferenzieren, können Sie einzelne Elemente mit
erfassen %Vor% Eine gute kurze Einführung in Referenzen (Erstellen und Verwenden von Referenzen) in Perl ist perldoc perfeftut
. Sie können es auch online lesen (oder es als PDF herunterladen). (Es spricht mehr über Referenzen in komplexen Datenstrukturen als in Bezug auf die Weitergabe von Unterprogrammen, aber die Syntax ist die gleiche.)
So, was ist der Sinn der Syntaxflexibilität? Lass es uns versuchen:
%Vor%Für tiefe Datenstrukturen wie diese ist es oft bequemer, mit einem Verweis zu beginnen:
%Vor%OK, also Fred bekommt ein neues Haustier, 'Velociraptor'
%Vor%Wie viele Haustiere hat Fred?
skalar @ {flintstones- & gt; {fred} - & gt; {pets}}
Lass uns sie füttern ...
%Vor%und so weiter. Die geschweifte Klammer-Suppe kann anfangs ein wenig entmutigend wirken, aber am Ende wird es ziemlich einfach, mit ihnen fertig zu werden, solange Sie konsistent sind in der Art, wie Sie mit ihnen umgehen.
Da es etwas klar ist, dass dieses Konstrukt verwendet wird, um eine Hash-Referenz als eine Liste von benannten Argumenten für ein Sub zu liefern, sollte auch darauf hingewiesen werden, dass dies
ist %Vor%kann übertrieben sein, anstatt nur @_
zu entpacken %Vor%Abhängig davon, wie komplex die Argumentliste ist.