Thread HASH setzen mit push? (6 answers)
Opened by toby at 2006-09-06 01:38

sid burn
 2006-09-06 02:22
#69529 #69529
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das dient eher zur Vereinfachung. ;)

Solche Sachen sind für komplexe Datenstrukturen gut. Stell dir vor du hast mehrere Kunden. Jeder Kunde ist über eine Kundenid eindeutig identifizierbar. Weiterhin besitzt jeder Kunde mehrere Daten. Name, Vorname, Adresse ... Diese möchtest du nun alle Speichern, und einfach wieder auf diese Daten zugreifen können.

Ein hash kann immer nur einen String einen einzigen Skalar zuweisen. Du könntest also auf die Idee kommen folgendes zu tun:

Code: (dl )
1
2
3
$name{0001} = 'gomez';
$vorname{0001} = 'frank';
$adresse{0001} = 'Kuhlhoffstr...'

u.s.w.

Vergeudet bei einer Menge von Daten viel Speicher, und sollte wohl auch nicht die schnellste Methode sein. Mit einer Hashreferenz sieht es besser aus.

Den da hast du einfach einmalig deine Kundenid, und der Wert ist ein hash der einfach alle Deine Kundendaten enthält.

Code: (dl )
1
2
3
4
5
6
$kunde{0001} = {
name => 'gomez',
vorname => 'frank',
adresse => 'Kuhlhoffstr. ....',
}
$kunde{0002} = { .... }


Das lässt deine Daten natürlicher erscheinen. Auch ist es einfacher solche Daten im Programmcode zu nutzen.

Zum anderen lassen sich abhängigkeiten besser darstellen. Stell dir vor du fügst ein Attribut hinzu das "Geschwister" heißt. Der Wert soll ein Array sein, dass die geschwisternamen enthalten.

Code: (dl )
1
2
3
4
5
6
7
8
$kunde{0001} = {
name => 'gomez',
vorname => 'frank',
adresse => 'Kuhlhoffstr. ....',
geschwister => [
"linda", "detlef", "anne", ...
]
}


Spätestens jetzt würde es verdammt schwer sein dies noch mit normalen Hashes abzubilden. Auser du fängst auf einmal an alles in einem String abzulegen mit Delimitern, fängst an mit "split" u.s.w. herum zu hantieren. Fehler wird man dabei wahrscheinlich früher oder später machen. Leicht zu warten wird es nicht mehr, dein Code wird komplex. Zum anderen wird es schwer wenn du nochmals weitere Ebenen Tiefer gehst.

Quote
Wie kommt dieses anonyme Array als Wert in den Hash rein?!? Ich hätte eigentlich sowas in der Richtung erwartet: "$hash{"key2"} = \@values;" ?

Würde auch gehen. Jedenfalls ohne das Anführungszeichen vor dem $hash...

Das ganze wird deswegen ein Array weil er um
Code: (dl )
$hash{"key"}
nochmals einen
Code: (dl )
@{ ... }
geschrieben hat. Dadurch das dies dort steht wird der Value des Hashes als Arrayreferenz Dereferenziert. Und der Wert "value" wird dann diesem Array hinzugefügt.


Bei der Methode solltest du Wissen das du normale Array/Variablen/Hashes auch so schreiben kannst.
Code: (dl )
@{hallo}
"hallo" zeigt letztendlich auch nur auf einen Speicherbereich (Bei Perl dann auf einen Typeglob). Du kannst anstatt das "hallo" dann aber auch den Speicherbereich benutzen auf den halt Zufälligerweise der Wert eines Hashes zeigt.

Code: (dl )
@{ $hash{"key"} }
Du hast also "hallo" nur durch eine andere Angabe ausgetaucht, die dir ebenfalls sagt welchen Speicherbereich dieses Array nutzen soll.\n\n

<!--EDIT|sid burn|1157495804-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread HASH setzen mit push?