[Dresden-pm] also zu den Hashes un Rerenzen ...

Steffen Winkler steffen.winkler at gmx.net
Fre Feb 3 13:04:20 PST 2006


... so schwer ist das nicht.

Es gibt Listen, in denen stehen  bis viele Elemente. Listen werden von
runden Klammern umschlossen. Solche Listen kann man natürlich keinem Scalar
übereignen, welcher ein Container für 1 Stück irgendetwas ist. Listen kan
man einem Array zuweisen und wenn diese gedadzahlige Elemente beinhalten,
dann nimmt si auch ein Hash an, wobi dann immer das 1. der Schlüssel und das
2. der Wert sein wird.

@array = (1,2,3,4,5,6,7,8,9,10);
%hash  = (1..10); # gleiche Liste, nur andere Schreibweise

Die Eckigen Klammern haben etwas mi einem Array zu tun und die {} mit einem
Hash.

Das erste Element im Array ist also $array[0];
Der erste Eintrag im Hash ist $hash{1}, hat den Wert 2.

Ein Array ist eine Menge von Scalaren, und ein Hash kan auch Scalare
Speichern, die nicht über einen Index, sondern über einen Schlüssel wieder
erreichbar sind.

Nun zu den komplexen Datenstrukturen. Wenn man eine Referenz von einem Array
oder Hash hat, dann ist das auch nur ein Wert und den kann manin einem
Scalar speichern. Diese Referenz verweist dann auf Array oder Hash. Wenn
eine Referenz also ein Scalar ist, ist es auch naheliegend, daß m diese in
einem Array oder als Wert in einem Hash speichern kann. Und genau das ist
die Idee. Eine REferenz wird mit \ gebildet. So ist \@array die Referenz des
Arrays und \%hash die Referenz auf den Hash.

$array[0} = \%hash; bedeutet, daß man über $hash{1} und $array[0]->{1} genau
den gleichen Wert, also die 2 zurück bekommt.

Nun will man das Ganz gleich in einem Zug definieren, also nicht erst jedes
einzeln und dann das miteinander zusammenhängen. Das eht dann so:

@array = (
  {1..10}, # das ist jetzt der Hash im ersten Arrayelement
           # und daß man sieht, daß es einer ist, müssen natürlich die {}
sein
           # und die bilden gleich die Referenz auf den Hash
           # DerHash hat nun keinen Namen, deswegen ist annonym.
           # Aber er st da, weil er über $array[0] erreichbar ist.
           # Das reicht doch.
  (2..10), # na die anderen Arrayelemente packen wir auch noch rein
           # Die runden Klammern sin optional für die Liste
);
Das Array enthält nun 10 Scalare, der erste ist die Hashreferenz.
Dann machen wir das gleich noch mit einer Arrayreferenz, anstatt es Hashes.
@array = (
  [1..10], # Arrayreferenz -> eckige Klmmern!!!
  (2..10), 
);

Wenn man keine Listen () in einen Hash packt, dann schreibt man die
Einzelelemente immer paarweise getrennt mit Komma. Zwischen Schlüssel und
Wert kommt eigentlich auch ein Komma aber besser das =>. Das sieht beser
aus, weil man gleich sieht,was gemeint ist und außerdem erlaubt es ,daß das
Element was links von => steht, keine Quotingzeichen benötigt. Voraussetzun
ist nur, daß der Text nur aus 0-9A-Za-z_ bestehen darf. Das ist meist
üblichSo paßt das.

Alles klar???

-- 
Telefonieren Sie schon oder sparen Sie noch?
NEU: GMX Phone_Flat http://www.gmx.net/de/go/telefonie