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

Speichern von Daten aus array in Hash: %hash und @array/aref

Leser: 1


<< >> 7 Einträge, 1 Seite
Duff
 2007-05-25 16:48
#76959 #76959
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich möchte aus einem Array Werte auslesen und in einem Hash speichern.
Das Array hat folgenden Aufbau:

Schlüssel1 Wert1 Wert2
Schlüssel2 Wert3
Schlüssel3 Wert4 Wert5
Schlüssel4 Wert6 Wert7
...

Es existiert immer ein Wert, der zweite Wert ist aber nicht immer vorhanden (siehe Schlüssel2).

Habe es bisher so versucht:
Code: (dl )
1
2
3
4
5
6
for my $line (@array) {
my ($key, $value1, $value2);
$value2 = undef;
($key, $value1, $value2) = (split(/\s+/, $line))[0,4,7];
#push @{$hash{$key}}, [$value1, $value2];
}


Die Auskommentiert push Zeile funktioniert so auch nicht. Wenn ich mir die Werte ($key, $value1, $value2) einzeln ausgeben lasse, erhalte ich die Fehlermeldung: Use of uninitialized value in concatenation (.) or string

Ich möchte das ganze in einem Hash speichern, indem der Schlüssel auf value1 oder und value2 zeigt.

Gruß,
Daniel\n\n

<!--EDIT|Duff|1180097326-->
D'OH
Daniel
Linuxer
 2007-05-25 18:34
#76960 #76960
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Hi,

versuch es doch mal mit:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
for my $line (@array) {
# alle 3 Variablen sind nun undef
my ($key, $value1, $value2);

# Zuweisung; eigentlich sollten alle 3 nun Werte haben
# es sei denn, dass split kein Ergebnis liefern konnte
($key, $value1, $value2) = (split(/\s+/, $line))[0,4,7];

# wenn $value2 undef ist, dann fuege Leerstring ein
push @{$hash{$key}}, [$value1, $value2 || '' ];
}
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
PerlProfi
 2007-05-25 19:34
#76961 #76961
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Wieso machst du da überhaupt ein push() ?
können die Schlüssel mehrmals im Array auftauchen ?

[Edit] Das hier einfach überlesen, es ist falsch
Ansonsten kriegst du einen Fehler, falls die Values von deinem Hash keine Arrayreferenzen enthalten, wenn du den push() machst.
Da würde folgendes vor dem push() helfen:
Code: (dl )
$hash{$key} ||= [];

[/Edit]

Und wenn der 2. Wert definiert ist, aber eine 0 enthällt, wird trotzdem ein Leerstring in die Struktur geschrieben, um das zu verhindern kannst du im push() mit ?: arbeiten oder vor dem push() folgendes einfügen und dann das || im push() weglassen.
Code: (dl )
$value2 = '' unless defined($value2);


MfG\n\n

<!--EDIT|PerlProfi|1180173864-->
bloonix
 2007-05-26 04:01
#76962 #76962
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Just an example:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;
use Data::Dumper;

my @array = (
  'Schlüssel1    Wert1 Wert2',
  'Schlüssel2    Wert3',
  'Schlüssel3    Wert4 Wert5',
  'Schlüssel4    Wert6 Wert7',
);

my %hash;

foreach my $line (@array) {
  my ($key, @values) = split /\s+/, $line;
  $hash{$key} = \@values;
}

print Dumper(\%hash);
\n\n

<!--EDIT|opi|1180138941-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Ronnie
 2007-05-26 11:12
#76963 #76963
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
my %hash = map { my ($k, @v) = split /\s+/; $k => \@v } @array;
pq
 2007-05-26 12:52
#76964 #76964
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=PerlProfi,25.05.2007, 17:34]Ansonsten kriegst du einen Fehler, falls die Values von deinem Hash keine Arrayreferenzen enthalten, wenn du den push() machst.[/quote]
das stimmt so nicht. ist ein hash-value undef, dann erstellt perl das array
on-the-fly, wenn man ein push macht.
siehe
Code: (dl )
1
2
3
4
$ perl -Mstrict -wle'
my %hash = ( key => undef);
push @{ $hash{key} }, 23;'
$
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
PerlProfi
 2007-05-26 14:01
#76965 #76965
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Oh! Praktisch.

Ich hatte eigentlich gedacht das würde eine Fehlermeldung der Art Can't use string ("") as an ARRAY ref while "strict refs" in use at x line x. geben.

Werd ich mir mal für die Zukunft merken.
<< >> 7 Einträge, 1 Seite



View all threads created 2007-05-25 16:48.