are you confined to representing your tree that way? i've done some basic relationship traversals using a hash of node objects, each referring to it's parent. you can then just lookup the node you want and do a recursive call up the parent chain like so:
package Node;
use strict;
use warnings;
sub new
{
my $self = bless( {}, shift );
my $name = shift;
$self->name($name);
return $self;
}
sub name
{
my $self = shift;
@_ ? $self->{name} = shift : $self->{name};
}
sub parent
{
my $self = shift;
@_ ? $self->{parent} = shift : $self->{parent};
}
sub ancestory
{
my $self = shift;
my $decendants = shift || ();
my $name = $self->name();
unshift @{$decendants}, $self->name();
my $parent = $self->parent();
$parent ? $parent->ancestory($decendants) : $decendants;
}
my %Nodes;
sub GetNode
{
my $nodeName = shift;
if ( ! $Nodes{$nodeName} )
{
$Nodes{$nodeName} = new Node($nodeName);
}
return $Nodes{$nodeName};
}
#
# load relationships
#
while (<DATA>)
{
chomp;
my ($parentName,$childName) = split ",",$_ ;
my $parentNode = GetNode($parentName);
my $childNode = GetNode($childName);
$childNode->parent($parentNode)
}
#
# print path to the node you are looking for
#
print join " ", @{GetNode("managedApplication")->ancestory()};
print "\n";
print join " ", @{GetNode("personnel")->ancestory()};
print "\n";
__DATA__
top,inetUser
top,person
top,application
person,organizationalPerson
application,managedApplication
organizationalPerson,managedPerson
managedPerson,personnel
produces:
top application managedApplication
top person organizationalPerson managedPerson personnel