I did post to the perl-beginners mails list, still have not gotten any responses. I will try there first in the future.
Ian's worked great, except it kept repeating. Here is what I came up with on my own, with a little help from a friend at work. The second foreach in ShowPage is there to test what I will pass to Template.pm. #!\usr\bin\perl use strict; use vars qw($Down $personHeader $person_number %personTree %persons %persons @DownList @personHeader); my $person_number = "571508"; &CreateTableArrays; &ShowPage; ######################################################################## ######## # ######################################################################## ######## sub ShowPage() { push (@DownList, $person_number); foreach my $key ( keys %persons ) { if ( $person_number eq $persons{$key}->{personNumber}) { foreach my $key1 ( keys %persons ) { if ( $persons{$key}->{UplinepersonNumber} eq $persons{$key1}->{personNumber} ) { print "Upline -> personNumber --> $persons{$key1}->{personNumber}\r\n"; } } print "\tpersonNumber -> $persons{$key}->{personNumber}\r\n"; $personTree{$person_number}{$Down} .= (); &GetDown($person_number); } } foreach my $key ( sort keys %personTree ) { print "$key|$personTree{$key}->{$personHeader}\r\n"; } } #End of ShowVisionPage ######################################################################## ######## # ######################################################################## ######## sub GetDown() { my ($NewNames) = @_; foreach my $key ( keys %persons ) { if ( $NewNames eq $persons{$key}->{UplinepersonNumber} ) { print "\t\tDown to $NewNames -> $persons{$key}->{personNumber}\r\n"; $personTree{$NewNames}{$Down} .= "$persons{$key}->{personNumber} "; &GetDown($persons{$key}->{personNumber}); } } } #End of GetDown ######################################################################## ######## # ######################################################################## ######## sub CreateTableArrays() { my @personHeader = qw(personNumber UplinepersonNumber); while (my $personLine = <DATA>){ chomp($personLine); my @person_in = split(/\|/, $personLine); for ( my $i=0 ; $i <= $#personHeader ; $i++ ) { $persons{$person_in[0]}{$personHeader[$i]} = $person_in[$i]; } } } #End of CreateTableArrays 1; __DATA__ 123456|1438566 123457|1438566 123458|1438566 123459|1438566 123460|1438566 123461|1438566 123462|1438566 123463|1438566 123464|1438566 1438566|22222 564737|123458 564738|123458 564739|123458 564740|123458 564741|123458 571508|1438566 987651|571508 987652|571508 987653|571508 987654|571508 987655|987651 987656|987651 987657|987651 987658|987657 --end-- -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] Sent: Tuesday, January 07, 2003 5:21 PM To: [EMAIL PROTECTED] Subject: Re: Array problem On 07 Jan 03 at 09:54:13AM, Tim Dolezal wrote: > If this is the wrong list for this question, can you please let me > know whish list I should go to. > > My output should look something like this: > > a-\ > |-b <snip> > My data file has at least these two columns: > > Col1 Col2 > a > b a <snip> > What is the best way to do this? I wouldn't claim mine is the best solution, but it is reasonable. It creates a hash of lists, where each node is a list of children for that node. Then it starts at the root node and recursively prints out the tree. I fiddled with different mechanisms for correctly printing the lines that connect to later nodes, but I settled on simply remembering a string to print ($indent). ---------- SCRIPT: #!/usr/bin/perl -w use strict; my %tree; while (my $line = <DATA>) { my ($item, $parent) = split /\s+/, $line; push @{$tree{$parent}}, $item; } print_node("", ""); sub print_node { my ($key, $indent) = @_; return unless exists $tree{$key}; my @children = @{$tree{$key}}; for (my $i = 0; $i < @children; ++$i) { my $child = $children[$i]; print "$indent| \n"; print "$indent\\-$child\n"; my $new_indent = $indent . (($i == @children - 1)? " ": "| "); print_node($child, $new_indent); } } __DATA__ a b a c b d c e c f a g d h f i f j i k i l k m a OUTPUT: | \-a | \-b | | | \-c | | | \-d | | | | | \-g | | | \-e | \-f | | | \-h | | | \-i | | | \-j | | | \-k | | | \-l | \-m TIM'S OUTPUT: a-\ |-b | | | \-c | | | \-d | | | | | \-g | | | \-e | |-f | | | \-h | | | \-I | | | \-j | | | \-k | | | \-l | \-m LIMITATIONS: . It does not sort the child nodes in any way; it wouldn't be hard. . It does not format the tree exactly as you have specified (although your formatting for the root node is not consistent anyway). You might want to put in a special case for the root node to avoid it appearing to be a child of nothing. . It is case-sensitive. Your data and output (i, I) suggest case-insensitivity. ---------- Regards, Ian