my @chain = get_chain($employee); foreach my $emp (@chain) { print $emp->{name}, qq{\n}; } sub get_chain { my ($e_id) = @_; # Assumes that id is the employee id field, # and supervisor is also an employee id. my $en_select = q{SELECT name, supervisor FROM employee WHERE ( id = ? ) LIMIT 1;}; my $ens = $dbh->prepare($en_select); my $enr = $ens->execute($e_id) or die $dbh->errstr; my %link = ( id => $e_id, ); my @row_enr = $ens->fetchrow_array; $link{name} = $row_enr[0]; if ( defined $row_enr[1] and $row_enr[1] != $e_id ) { $link{supervisor} = $row_enr[1]; return ( get_chain( $link{supervisor} ), \%link ); } else { return ( \%link ); } }