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

Zwei Arrays in Hash wandeln



<< >> 5 Einträge, 1 Seite
RPerl
 2009-01-03 21:52
#117551 #117551
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo Leute,

ich steh gerade maechtig auf dem Schlauch.
Folgendes Problem:
2 Arrays zu einem Hash wandeln. 1. Array = Schluessel / Key, 2. Array = Werte / Values
Ich habe folgendes geschrieben, dass aber anscheinend nicht funktioniert:

Code (perl): (dl )
1
2
3
4
5
1704         foreach my $values ( @{$ref_values} ) {
1705               foreach my $fields ( @{$ref_fields} ) {
1706                      $data{$fields} = $values;
1707               }
1708         }


Die Schluessel werden alle korrekt angelegt, haben aber alle ein und den selben Wert.
Wie wuerdet ihr das machen?
Ich hatte da mal 'ne Loesung mit map() glaube ich. Erinner mich nur gerade nicht mehr dran.

Vielen Dank und liebe Gruesse,
rperl
LanX-
 2009-01-03 22:39
#117552 #117552
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Beispielhafte Anwendung für Hashslices!

Code (perl): (dl )
@data{@$ref_fields}=@$ref_values;


deine Lösung ist natürlich murks, weil du 2 Schleifen statt einer hast!

Der Wert des letzten äußeren Durchlaufs wird allen Feldern der inneren Schleife zugewiesen.

Klassicshe Lösung wäre einen Schleifenindex durch beide Arrays laufen zu lassen.
Gast Gast
 2009-01-03 22:45
#117553 #117553
Schau dir mal einen code an und überlege dir genau was er macht.
Du hast zwei Schleifen, die eine in der anderen, wann wird welche Schleife durchgearbeitet und welche Werte stehen zu welchem Zeitpunkt in den Variablen.
(Tipp: schreib dir mal ein Beispiel mit drei Werten und gehe es auf dem Papier durch.)




Aber ich will dich nicht unnötig auf die Folter spannen:
Code (perl): (dl )
1
2
3
foreach my $pos (0..$#{$ref_values} ) {
  $data{$ref_fields->[$pos]} = $ref_values->[$pos];
}
Das hier funktioniert.
Dennoch solltest du meinen Vorschlag beherzigen, dann machst du den Denkfehler nicht noch mal.
RPerl
 2009-01-03 23:02
#117554 #117554
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Quote
Klassicshe Lösung wäre einen Schleifenindex durch beide Arrays laufen zu lassen.

Ja, hab auch tatsaechlich an eine for-Schleife im C-Stil gedacht, das ist aber wie gesagt irgendwie wenig perlish.

Werde auf jedenfall die hashslice Loesung nehmen :)

Quote
(Tipp: schreib dir mal ein Beispiel mit drei Werten und gehe es auf dem Papier durch.)


Danke fuer den Tipp! Werde ich morgen tatsaechlich mal probieren.

Schoenen Abend Jungs,

rperl
sid burn
 2009-01-04 03:52
#117556 #117556
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Dafür kannst du auch die Funktion "zip" in List::MoreUtils nutzen.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
# Core Modules
use strict;
use warnings;

# Debugging Modules
use Data::Dumper;

# CPAN Modules
use List::MoreUtils qw/zip/;

my @keys   = qw/name vorname geburtstag/;
my @values = qw/Raab David 19.02.1983/;

my %hash = zip @keys, @values;

print Dumper \%hash;


Ausgabe:
Code (perl): (dl )
1
2
3
4
5
$VAR1 = {
          'vorname' => 'David',
          'name' => 'Raab',
          'geburtstag' => '19.02.1983'
        };
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 5 Einträge, 1 Seite



View all threads created 2009-01-03 21:52.