Schrift
[thread]8228[/thread]

Rekursive durcharbeitung von Arrays

Leser: 1


<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
Gast Gast
 2006-08-09 12:40
#68745 #68745
Hallo & einen wunderschönen guten Morgen

Erstmal: Irgentwie klappt das Anmelden nicht irgentwie bekomme ich immer den Fehler das nicht alle daten gesendet werden konnten. Auch bei der Seite wo man den Einmaligen Code eingeben kann.

So und nun zu meinem Problem:

Ich möche einen Tree zeichnen lassen.

Ich habe "n" Arrays , jedes Array symbolisiert ein Switch.

In den Arrays stehen die Adressen der Switche drin die an das jeweilige Switch angeschlossen sind.

So, ich glaube ich muss das ganze in ein mehrdimensionales Array packen um es rekursiv durchlaufen zu können, aber wie mache ich das am besten automatisiert, da ich nicht weis wie viele switche es sind und wie vile dran angeschlossen sind ?

Dann habe ich gelesen das man eine Subfunktion schreiben muss die sich dann wieder selbst aufruft, allerdings weis ich nicht wie, da ich relativ neu bin bei perl bzw programmieren allgemein.

Könnt ihr mir da auf die Sprünge helfen?

Besten dank im Voraus..

mfg fk
renee
 2006-08-09 12:53
#68746 #68746
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kannst Du mal ein paar Beispieldaten posten? Wie sehen die Arrays aus? Wie soll das Ergebnis aussehen?
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
 2006-08-09 13:12
#68747 #68747
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
da die genauen angaben fehlen, erst mal ganz grob. du übergibst einer subroutine eine referenz auf das entsprechende array. jetzt läufst du durchs array und machst für jeden wert der keine referenz ist, was auch immer du mit den daten tun willst. für jede referenz die du findest ruft die sub sich wieder selbst mit eben dieser gefundenen referenz als argument auf. so einfach kann rekursion sein :)
achja, ob ein wert eine referenz ist oder nicht kann man mit der funktion ref testen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2006-08-09 13:31
#68748 #68748
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde Dir empfehlen, ein Hash aufzubauen, der so aussieht:
Code: (dl )
1
2
my %switches = (switch0 => [qw/switch1 switch2 switch3/],
switch1 => [qw/switch4/],);


Damit wird das ganze einfacher...
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/
Gast Gast
 2006-08-09 13:07
#68749 #68749
Hm irgentwie kann ich nicht auf mein Thema Antworten, und wie schon gesagt registrieren klappt auch nicht....

Also die Arrays sehen wie folgt aus:

@switch0 = qw(switch1 switch2 switch3);
@switch1 = qw(switch4)
@switch2 = qw();
@switch3 = qw();
@switch4 = qw();

Also an switch 0 sind switch 1,2 und 3 angeschlossen und an switch3 ist switch 4 angeschlossen.

Es soll dann mal so aussehen:

switch0
switch1
switch4
switch2
switch3

und so weiter je nach dem wie viele wo angeschlossen sind
renee
 2006-08-09 13:37
#68750 #68750
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit dem Hash würde es dann so gehen:
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
24
25
26
27
28
#!/usr/bin/perl

use strict;
use warnings;

my %switches = (switch0 => [qw/switch1 switch2 switch3/],
switch1 => [qw/switch4/],);

my $start = 'switch0';

print_tree(\%switches,$start,0);

sub print_tree{
my ($hashref,$start,$level) = @_;

my $whitespaces = ' ' x ($level * 5);
print $whitespaces.$start,"\n";

for my $switch(@{$hashref->{$start}}){
if(exists $hashref->{$switch}){
print_tree($hashref,$switch,$level+1);
}
else{
my $whitespaces = ' ' x (($level+1) * 5);
print $whitespaces.$switch,"\n";
}
}
}


Edit: Fehler beseitigt\n\n

<!--EDIT|renee|1155117220-->
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/
Ronnie
 2006-08-09 15:37
#68751 #68751
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
GraphViz bietet sich hier an:
Code: (dl )
1
2
3
4
5
6
7
digraph Switches {
nodesep=0.7
switch0 -> switch1
switch0 -> switch2
switch0 -> switch3
switch1 -> switch4
}

http://www.ronnie-neumann.de/images/switch.png
Siehe http://www.graphviz.org/ und CPAN:GraphViz.
Ronnie
 2006-08-09 17:23
#68752 #68752
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ja, so ziemlich die wichtigsten Formate einschließlich JPG und SVG werden unterstützt.
Gast Gast
 2006-08-09 17:16
#68753 #68753
@renee

Danke das Funktioniert.Ein anstoß in die richtige richtung hätte zwar gereicht aber so is noch besser.

@Ronnie

Das sieht sehr gut aus, mal schauen ob ich das instelliert bekomme.

Gibt es das auch das eine svg oder jpg Datei erstellt wird?
fk
 2006-08-10 13:29
#68754 #68754
User since
2006-08-10
9 Artikel
BenutzerIn
[default_avatar]
Hallo, so nun endlich als angemeldeter User :)

Also das Graphviz ist genau das was ich brauche, nur bekomme ich das unter Windows nicht zum laufen.

Habe mit nmake das Modul installiert und deinen beispielcode ausgeführt da hat er gemeckert das er in @INC nicht RUN PM finden kann, ok hab ich das Modul installiert und in den entsprechenden Ornder Kopiert, nun bekomme ich nen Fehler das im Modul Graphviz ind Line 8 irgent ein Syntax fehler ist.

Was mache ich nun?\n\n

<!--EDIT|fk|1155202611-->
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2006-08-09 12:40.