Alexander (HH): Parameterübergabe (Hash und Skalar)

Beitrag lesen

Moin Moin!

Deine Schwierigkeit ist vermutlich, dass dir nicht klar ist, dass ein Hash ein Array ist und du deshalb nicht erkennst, dass ein Array als Parameter eben nicht ein Wert ist sondern jeder Eintrag ist ein Parameter, deshalb ist es sinnvoll ein Hash als Referenz zu übergeben oder den von Alexander gezeigten Weg mit Protyping.

Argl! Hashes und Array sind zwei völlig verschiedene Sachen. Bei jedem Funktionsaufruf werden alle Parameter der Reihe nach in eine temporäre Liste gepackt, die innerhalb der Funktion dann im Array(!) @_ zur Verfügung steht. Dabei werden (wenn keine Prototypen im Spiel sind) Arrays und Hashes zu einer (Teil-)Liste "geplättet". Diese enthält im Array-Fall alle Array-Elemente in der Reihenfolge des aufsteigenden Indexes. Im Hash-Fall enthält sie abwechselnd Schlüssel und Wert, die Reihenfolge der Paare ist aber explizit *NICHT* garantiert.

Das Gemeine an Perl und insbesondere der Dokumentation ist, dass Listen und Arrays zwei *UNTERSCHIEDLICHE* Sachen sind, obwohl sie oft austauschbar sind und in aller Regel automatisch ineinander konvertiert werden. Um die Verwirrung komplett zu machen, gibt es eine Builtin-Funktion wantarray, die anzeigt, ob eine Funktion im LISTEN-Kontext aufgerufen wurde oder nicht. Das kann eine Zuweisung an ein Array sein (@a=foo(...);), aber auch eine Zuweisung an ein Hash (%h=foo(...);) oder aber eine echte Liste (foreach (foo(...))).

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".