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

tabelarische liste aus array problem



<< >> 10 Einträge, 1 Seite
Gast Gast
 2004-05-21 14:19
#82626 #82626
Hallo

habe ien Problem beim erstellen einer tabelarischen liste aus einem mehrdimensionalen array
( hoffe habe das so richtig umschrieben )

also mein arry is wie folgt aufgebaut :

@categories = (
'Autos:Opel:Astra',
'Autos:Opel:Corsa',
'Motorräder:Kawa:xx1',
'Motorräder:Susi:600:xx1',
Motorräder:Susi:750:xx1'
);

da hloe ich mir mit
Code: (dl )
1
2
3
4
5
6
7
foreach $category (@categories) {
if ($category =~ /^([^:]+):/) {
$category = $1;
}
push (@categories_to_print, $category) unless $categories_to_print[$#categories_to_print] eq $category;
}
my @categories_to_print = (sort @categories_to_print);

die Hauptliste

in einer for schleife werden diese dann tabelarisch aus gegeben, soweit so gut.
jetzt mein problem

wenn ich versuche die jeweils dazugehörigen unterbereiche zu bekommen, bekomme ich keinen rückgabe wert :-(

was is an folgendem code falsch ß

Code: (dl )
1
2
3
4
5
6
7
my $cat = $categories_to_print[$j];
my @kategorien = kategorie_liste_holen ($cat);
my @kategorie_zeilen = @kategorien ?
map $CGI->td( " &nbsp;&nbsp; " , $_ ), @kategorien :
$CGI->td( "keine Liste" );
print $CGI->Tr( [@kategorie_zeilen
] );

hier die sub kategorie_listeholen
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub kategorie_liste_holen {
my $cat = shift;

my @sub_categories_to_print;
foreach my $category (grep { /^$cat:/; } @categories) {
if ($category =~ /^($cat:[^:]+):/) {
$category = $1;
}
push (@sub_categories_to_print, $category) unless $sub_categories_to_print[$#sub_categories_to_print] eq $category;
}
return @sub_categories_to_print;
}


hoffe mir kann da jemand weiterhelfen
Taulmarill
 2004-05-21 17:45
#82627 #82627
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, warum baust du nicht einfach sofort einen array of arrays (zweidimensionaler array)?
etwa so:

Code: (dl )
1
2
3
4
5
my @categories_to_print;
foreach my $line ( @categories ) {
my ( $art, $marke, $modell ) = split ":", $line;
push (@categories_to_print, [$art, $marke, $modell] );
}
\n\n

<!--EDIT|Taulmarill|1085147164-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Gast Gast
 2004-05-21 18:34
#82628 #82628
Zweckmäßig wäre vielleicht ein solches Array:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $categories = [
   ['Autos',
       ['Opel',
           ['Astra', 'Corsa',],
       ],
   ],
   ['Motorräder',
       ['Kawa',
           ['xx1',],
       ],
       ['Susi',
           ['600',
               ['xx1',],
           ],
       ],
       ['Susi',
           ['750',
               ['xx1',],
           ],
       ],
   ],
];


Sowas ist aber auch per Hash aufbaubar:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $categories = {
   '001'   => {
       'title'     => 'Autos',
       'parent'    => '',
       'children   => ['Opel', ],
   },
   '002'   => {
       'title'     => 'Opel',
       'parent'    => 'Autos',
       'children'   => ['Astra', 'Corsa',],
   },
   '003'   => {
       'title'     => 'Astra',
       'parent'    => 'Opel',
       'children'   => [],
   },
   '004'   => {
       'title'     => 'Corsa',
       'parent'    => 'Opel',
       'children'   => [],
   },
};
\n\n

<!--EDIT|Dieter|1085151175-->
psohdon
 2004-05-21 18:57
#82629 #82629
User since
2004-05-21
2 Artikel
BenutzerIn
[default_avatar]
hallo


also ich denke es liegt daran, das ich den wert aus der for schleife an eine sub routine weitergebe
da wird dann aus dem eigendlichen wert der zahlenwert
endsprechend kann die sub routine auch nichts finden, logisch.

die strucktur ändern, würde ich mehr als ungern, dann müste das script soweit schon geschrieben, wieder umgemodelt werden, worauf ich lieber verzichten möchte

direkt ein zweidimensionales array aufbauen is auch etwas ungünstig
da ich die zahl der einträge ( die der hauptbereiche ) als referenz für die for schleife nutze
Gast Gast
 2004-05-22 18:20
#82630 #82630
[quote=psohdon,21.05.2004, 16:57]die strucktur ändern, würde ich mehr als ungern, dann müste das script soweit schon geschrieben, wieder umgemodelt werden, worauf ich lieber verzichten möchte[/quote]
Wenn die Datenstruktur die Du aufgebaut hast, es nicht erlaubt dass Dein Programm auf eben diese Daten zugreifen kann, dann bleibt Dir wohl nichts anderes übrig.
psohdon
 2004-05-23 00:42
#82631 #82631
User since
2004-05-21
2 Artikel
BenutzerIn
[default_avatar]
doch die anderen funktionen die darauf zugreifen funktionieren ja
ohne problem

eben nur das was ich da vorhabe nicht
sprich das ganze array so aus zu geben das die jeweiligen einträge zusammen stehen

also z.B

Autos Motorräder
Opel Kawa
Astra 650
Corsa
VW Zubehör
Golf

etc pp
denke habe das oben auch nicht gerade gut umschrieben
Gast Gast
 2004-05-23 18:38
#82632 #82632
Schau Dir mal diesen Thread an:
Katalog
vielleicht hilft Dir das weiter.
Crian
 2004-05-24 17:33
#82633 #82633
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Ich würde ein AoH aufbauen.

Und benutze strict und versuche, klare Funktionen-Schnittstellen zu definieren. Deiner übergibst Du etwas und benutzt aber auch noch ein globales Array, das ist imho häslich.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steve
 2004-05-24 22:51
#82634 #82634
User since
2004-03-04
52 Artikel
BenutzerIn
[default_avatar]
Ich würds anders herum machen. Ein HoA. Und wenn nötig sogar ein HoHoA :)

steve
Crian
 2004-05-24 23:25
#82635 #82635
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Ich dachte, das 'H' komplizierter zu machen, also wiederum ein HoH gemischt mit Array als Werten.
Ob die erste Stufe A oder H ist hängt u.a. davon ab, ob man die Reihenfolge beibehalten will, oder nicht.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 10 Einträge, 1 Seite



View all threads created 2004-05-21 14:19.