Wird% $ var einen Perl-Hash-Hashwert referenzieren?

7

Ich sende ein Unterprogramm einen Hash und hole es mit my($arg_ref) = @_;

Aber was genau ist %$arg_ref ? Ist %$ dereferenziert den Hash?

    
brian d foy 18.02.2009, 20:54
quelle

5 Antworten

18

$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:

%Vor%

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:

%Vor%

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%     
Jon Ericson 18.02.2009, 20:59
quelle
7

Anstatt den gesamten Hash zu demeferenzieren, können Sie einzelne Elemente mit

erfassen %Vor%     
Paul Tomblin 18.02.2009 21:02
quelle
4

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.)

    
Telemachus 18.02.2009 23:19
quelle
2
%Vor%

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.

    
singingfish 19.02.2009 03:35
quelle
1

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.

    
Erik Johansen 19.02.2009 02:34
quelle

Tags und Links