Schrift
[thread]11202[/thread]

Einfacher Umgang mit Hashes



<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-01-27 23:44
#105253 #105253
[code]
my %name_zu_wert; # hash definiert
my %name_zu_id; # hash definiert
my %id_zu_wert; # diesen hash haette ich gern ;-)


%name_zu_wert = (
"hans" => "gluecklich",
"fred" => "feuerheiss",
"helmut" => "schnuffig",
);

%name_zu_id = (
"hans" => 1,
"fred" => 2,
"bruce" => 3,
"helmut" => 4,
);

Die simple Frage die ich habe: wie kann ich den Hash %id_zu_wert mit den Werten der beiden vorliegenden Hashes füllen ? Ich hänge fest :-|.
Struppi
 2008-01-28 02:09
#105260 #105260
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Im Prinzip so:
Code (perl): (dl )
%id_zu_wert = (%name_zu_wert, %name_zu_id);

Aber ich vermute das ist nicht das was du willst. Die Frage ist, was willst du?
murphy
 2008-01-28 03:36
#105262 #105262
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Vermutlich suchst Du so etwas:
Code (perl): (dl )
1
2
3
while (my ($name, $id) = each %name_zu_id) {
  $id_zu_wert{$id} = $name_zu_wert{$name}
}

When C++ is your hammer, every problem looks like your thumb.
Ronnie
 2008-01-28 08:11
#105263 #105263
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
EDIT: siehe nachfolgenden Post von murphy
murphy
 2008-01-28 18:40
#105264 #105264
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Ronnie: Deine neue Lösung sieht elegant aus, verbraucht aber schätzungsweise etwas mehr Speicher und doppelt soviel Zeit wie mein Code, bedingt durch das Erzeugen zweier temporärer Listen und zwei Hash-Lookups pro Iteration statt eines.
When C++ is your hammer, every problem looks like your thumb.
murphy
 2008-01-28 13:43
#105279 #105279
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Ronnie: Dem Namen des zu füllenden Hashes nach zu schließen wollte der OP aber eine Zuordnung von Werten zu IDs, während Dein Code eine Zuordnung von Namen zu IDs liefert.
When C++ is your hammer, every problem looks like your thumb.
Ronnie
 2008-01-28 18:26
#105289 #105289
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@murphy: sorry, lag an der Uhrzeit ...

Wenn undefs als Werte okay sind:
Code (perl): (dl )
%id_zu_wert = map { $name_zu_id{$_} => $name_zu_wert{$_} } keys %name_zu_id;
Ronnie
 2008-01-28 18:47
#105290 #105290
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@murphy: Ja, die klassischen Schleifen haben manchmal einfach Vorteile. Man gewöhnt sich halt doch sehr an map, grep (und noch ein paar andere in anderen Sprachen) das man sie dann auch an Stellen nutzt, wo sie gar nicht so vorteilhaft sind.
Strat
 2008-01-29 12:39
#105312 #105312
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
bei each %hash sollte man auch beachten, dass each ein iterator ist. Also nie eine each-schleife mit return oder so verlassen, weil beim nächsten each genau mit dem naechsten Element fortgesetzt wird, und nicht von Beginn an. Wenn man sowas wirklich mal braucht, dann das zurücksetzen des Iterators nicht vergessen, weil es sonst wohl schwierig zu findende Fehler geben könnte.

keys ist in der Beziehung einfacher zu handeln (auch wenn's ein klein wenig langsamer ist), z.B.
Code: (dl )
foreach my $key ( keys %hash ) {

und man kann sogar die Reihenfolge noch irgendwie sortieren.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2008-01-27 23:44.