Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6927[/thread]

identische hash-schlüssel??? (Seite 2)



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Dubu
 2005-04-26 01:35
#54212 #54212
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=supersucker,25.04.2005, 21:29]
pq,_
einfache gegenfrage: was erwartest du bei folgendem code?
$hash{key} = 23;
$hash{key} = 24;
print $hash{key};


hast ja recht, aber ich hatte das problem mittlerweile schon öfter das ich identische schlüssel gebraucht hätte ohne mir da erst ein komplexes speicherkonstrukt zu überlegen, kann mir nicht vorstellen das ich da der einzige bin....
[/quote]
Nein, aber Perl macht es recht einfach, beliebige Datenstrukturen aufzubauen. Wie schon genannt: siehe perldoc perldsc.

Quote
und bei obigem beispiel könnte sowas
wie
Quote
print $hash{key};

bei mehreren identischen schlüsseln auch eine liste zurückgeben (kann man ja je nach kontext vorher kucken ob man ne liste oder ein skalar zurückkriegt....)

ich persönlich fänds praktisch...

Ah, eine Liste! Was du hier suchst, ist also statt
Schluessel => skalarer Wert
ein
Schluessel => Listen-Wert

Das ist ganz einfach, denn die Liste bekommen wir, wenn der Hashwert eine Arrayreferenz ist:
Code: (dl )
1
2
3
push @{$hash{key}}, 23;
push @{$hash{key}}, 24;
print "@{$hash{key}}";

Hier wird fuer das push() von Perl automatisch eine Arrayreferenz in $hash{key} angelegt, damit ich diese mit @{...} dereferenzieren kann.

Ich kann auch alle Werte auf einmal zuweisen, indem ich gleich eine Referenz auf ein (anonymes) Array zuweise:
Code: (dl )
1
2
$hash{key} = [ 23, 24 ];
print "@{$hash{key}}";

Hier ist der Wert im Hash eine Referenz auf ein anonymes Array, das auf der rechten Seite des Gleichheitszeichens steht, in eckigen Klammern.

Man kann es natuerlich auch gleich dereferenziert schreiben, dann stehen links und rechts der Zuweisung jeweils Arrays und keine Referenzen (hier wird also der Inhalt eines Arrays in ein anderes kopiert!):
Code: (dl )
1
2
@{$hash{key}} = ( 23, 24 );
print "@{$hash{key}}";


Also: Speichere einfach fuer alle Schluessel Arrayreferenzen als Werte, dann koennen alle zu einem Schluessel gehoerenden Zahlen in dieses Array gespeichert werden.
pq
 2005-04-26 12:42
#54213 #54213
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=supersucker,25.04.2005, 21:29]...
Quote
print $hash{key};

bei mehreren identischen schlüsseln auch eine liste zurückgeben (kann man ja je nach kontext vorher kucken ob man ne liste oder ein skalar zurückkriegt....)[/quote]
ja, aber das musst du halt erst mal definieren. kann ja keiner ahnen.
jetzt, wo du's definiert hast, hast du ja von dubu die entsprechende
antwort bekommen.
wenn du jetzt mit tie() arbeitest, kannst du das ganze sogar ohne push()
implementieren, so dass alles wie ein ganz normaler hash mit einem
level aussieht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
supersucker
 2005-04-26 14:45
#54214 #54214
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hui,

ok, dass man das auch so machen konnte, wusst ich nicht...

bin anscheinend noch nicht weit genug in die tiefen von perl vorgedrungen........:-)

zu den letzten drei posts:

danke für die hilfe, werd ich mal so probieren
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-04-25 18:54.