Schrift
[thread]7159[/thread]

keys in mehrdimensionalen hashes

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Criamon
 2005-07-26 00:39
#56672 #56672
User since
2005-07-26
8 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich hab da ein 'kleines' Problem und hoffe Ihr könnt mir weiterhelfen.
Aus einen SQL Abfrage habe ich ein Array, dass ich mit
Code: (dl )
while ( my @aContr = $sqlResult->fetchrow_array()){

durchlaufe. Die Daten sollen dann in einem mehrdimensionalen Hash nach 2 der Felder gespeichert werden.
Am einfachsten ist wohl ein Codebeispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
my (%hData);

while ( my @aContr = $sqlResult->fetchrow_array()){
$hData{$aContr[1]} = (
{ $aContr[3] =>
{
TYP => $aContr[0],
DV => $aContr[1],
STATUS => $aContr[2],
PATTERN => $aContr[3],
.
.
.
}
}
);
# Hier kommt leider nur Müll raus
foreach my $t (keys %{$hData{$aContr[1]}} ){
foreach my $s (keys %{$hData{$aContr[1]}{$t}} {
print "KEY von $aContr[1]: $t | Value dazu ist: $hData{$aContr[1]}{$t}{$s}\n";
}
}
}

Das Problem scheint zu sein, dass ich die keys unterhalb von $hData{$aContr[1], bzw. deren Daten nicht richtig ansprechen kann.

Über einen Hinweis wäre ich SEHR dankbar - bin langsam am verzweifeln.

Schonmal Danke

Criamon
Ronnie
 2005-07-26 02:16
#56673 #56673
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Überprüf doch zuerst mal mit Data::Dumper ob die Struktur so aussieht wie sie soll:
Code: (dl )
1
2
3
4
5
use Data::Dumper;

# ...

print Dumper \%hData;
pq
 2005-07-26 02:25
#56674 #56674
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Wiki:perldoc perllol
Wiki:perloc perlref
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
Gast Gast
 2005-07-27 12:35
#56675 #56675
[quote=Ronnie,26.07.2005, 00:16]Überprüf doch zuerst mal mit Data::Dumper ob die Struktur so aussieht wie sie soll:
Code: (dl )
1
2
3
4
5
use Data::Dumper;

# ...

print Dumper \%hData;
[/quote]
Danke für die Tipps,

mit dem Dumper fällt auf, dass in jedem Hash ein Eintrag
Code: (dl )
'' => undef,

vorhanden ist, wo kann der herkommen? Er kommt zwar sehr oft, aber nicht immer als erster Eintrag vor...
Criamon
 2005-07-27 12:46
#56676 #56676
User since
2005-07-26
8 Artikel
BenutzerIn
[default_avatar]
Nachtrag,
ooops, das mit dem undef kam nach einer "optimierung" (die wohl keine war) vor!

In obrigen Fall habe ich immer nur den letzen Eintrag im Hash für den Fall, dass 2x der selbe DV vorkommt. Was natürlich nicht so sein soll :(
Strat
 2005-07-27 12:47
#56677 #56677
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
der duerfte aus deinem sql-statement kommen... ich vermute mal, dass du in irgendeiner spalte was berechnest oder so, und dort vergisst, der spalte einen eindeutigen Namen zu geben (mit AS)
[sql]SELECT sum(col1) AS summe FROM table[/sql]
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2005-07-27 12:48
#56678 #56678
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann solltest Du mal überprüfen, ob in der Datenbank in den Spalten, die in $aContr[1] bzw. $aContr[3] landen NULL erlaubt ist. Wenn ja, dann sind garantiert Einträge in der Datenbank drin, die dort auch NULL haben.

Du kannst auch erstmal mit print Dumper(\@aContr); das Array überprüfen.
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/
Criamon
 2005-07-27 13:06
#56679 #56679
User since
2005-07-26
8 Artikel
BenutzerIn
[default_avatar]
$aContr[1] bzw. $aContr[3] sind Primary Keys, von daher niemals NULL. print Dumper(\@aContr); bestätigt das auch.

Bei dem Problem mit dem undef hab ch wohl was falsch "verbessert" in der ursprünglichen Version liegt wie gesagt bei gleichem $aContr[1] immer nur ein Untereintrag vor.

Sagen wir mal:
1. $aContr = [A, B, C, D , E , F ]
2. $aContr = [A, B, G, H , I , J ]
3. $aContr = [A, K, L, M , N , O ]

Daraus soll entstehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%hContr = { 'B' => { 
'D' => {
TYP => 'A',
DV => 'B',
STATUS => 'C',
PATTERN => 'D'
}
'H' => {
TYP => 'A',
DV => 'B',
STATUS => 'G',
PATTERN => 'H'
}
}
'K' => {
'M' => {
TYP => 'A',
DV => 'K',
STATUS => 'L',
PATTERN => 'M'
}
}
}

Leider entsteht daraus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%hContr = { 'B' => { 
'H' => {
TYP => 'A',
DV => 'B',
STATUS => 'G',
PATTERN => 'H'
}
}
'K' => {
'M' => {
TYP => 'A',
DV => 'K',
STATUS => 'L',
PATTERN => 'M'
}
}
}

d.h der eintrag für 'D' fehlt, es bleibt immer nur der letzte Eintrag einer Unterhashes erhalten.

So langsam dreh ich hier durch :(

Auf jeden Fall "Danke für die Hilfe" :)

Criamon
renee
 2005-07-27 13:11
#56680 #56680
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
   $hData{$aContr[1]}->{ $aContr[3] } = (
{
TYP => $aContr[0],
DV => $aContr[1],
STATUS => $aContr[2],
PATTERN => $aContr[3],
}
}
);
\n\n

<!--EDIT|renee|1122455535-->
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/
Taulmarill
 2005-07-27 13:31
#56681 #56681
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
so klappts auch mit dem hash:
Code: (dl )
1
2
3
4
5
6
7
8
9
my %hContr = (
'B' => {
'D' => { TYP => 'A', DV => 'B', STATUS => 'C', PATTERN => 'D' },
'H' => { TYP => 'A', DV => 'B', STATUS => 'G', PATTERN => 'H' }
},
'K' => {
'M' => { TYP => 'A', DV => 'K', STATUS => 'L', PATTERN => 'M' }
}
);


beachte:
1. einem echten hash weist man erst einmal eine liste und keine referenz auf einen hash zu (runde statt geschweifte klammern)
2. JEDER wert wird entwerder durch ein komma oder ein => getrennt, du hattest kommata vergessen (dabei hat => übrigens genau die selbe funktion wie ein komma, es verbessert nur die lesbarkeit)

edit: ähm, ich glaub ich hab die fragestellung falsch verstanden. beachtet mich einfach nicht weiter :)\n\n

<!--EDIT|Taulmarill|1122456976-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-07-26 00:39.