Schrift
[thread]8297[/thread]

HASH setzen mit push?

Leser: 2


<< >> 7 Einträge, 1 Seite
toby
 2006-09-06 01:38
#69528 #69528
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo,

in einem Perlcode aus einem Buch habe ich gesehen, wie ein anonymes Array über push in ein Hash gesetzt wird. Ich habe die Funktionsweise dieser Variante nicht verstanden, deswegen wende ich mich an Euch mit der Bitte um Erklärung, wie funktioniert es im Inneren, dass hier auf eine zauberhafte Art dieser Hash gesetzt wird?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

# es gab da einen Hash
my %hash;

# und dann das mir unbekannte setzen des Hashes:
push @{$hash{"key"}},"value";

# Ausgabe:
while(my ($key,$value) = each %hash ){print "$key => @$value\n";};


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


Danke für die Erklärungen! :)
Tobias\n\n

<!--EDIT|toby|1157495084-->
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
toby
 2006-09-06 02:30
#69530 #69530
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo sid burn :)

Danke für die ausgiebige Erklärungen. Eigentlich wollte ich nur wissen, wie das funktioniert, dass man auf diese Weise über push ein Wert des Hashes setzen kann.. nun, nachdem ich es mir nun mehrere male angeschaut habe, und nun auch noch Deine hinzueditierte Antwort gelesen habe, ist es sonnenklar... mit dem push setzt mal "value" im listenkontext als Wert von $hash{"key"}.. so einfach ist perl.. sorry für meine ungenaue Frage und mehrmaliges editieren ;)

Gruß
Tobias\n\n

<!--EDIT|toby|1157495600-->
sid burn
 2006-09-06 02:38
#69531 #69531
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Habe nochmal etwas hinzueditiert, hoffe das wird nochmal etwas klarer. Intern ist es aber trotzdem etwas kompliziert.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
topeg
 2006-09-06 02:39
#69532 #69532
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
um es kurz zu fassen:
Diese Stelle:
Code: (dl )
push @{$hash{"key"}},"value";

ist Äquivalent zu:
Code: (dl )
1
2
3
4
5
6
7
8
# Array erzeugen und Referenz in den Hash
@array=();
$hash{"key"}=\@array;
# altenativ:
$hash{"key"}=[];
# und den Wert "value" an das Array (anonymes Array bzw. Referenz auf das Array) anhängen
$ref_array=$hash{"key"};
${$ref_array}[$#{$ref_array}+1]="value";
toby
 2006-09-06 02:55
#69533 #69533
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
[quote=topeg,06.09.2006, 00:39]
# altenativ:
$hash{"key"}=[];
# und den Wert "value" an das Array (anonymes Array bzw. Referenz auf das Array) anhängen
[...]
[/quote]

Jetzt hab'ich's endgültig gerafft! :) TIMTOWTDI ;)

Schönen Dank an Euch! :)
Tobias\n\n

<!--EDIT|toby|1157497950-->
renee
 2006-09-06 09:57
#69534 #69534
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Lesenswert zum Thema Referenzen: perlreftut (deutsch)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 7 Einträge, 1 Seite



View all threads created 2006-09-06 01:38.