my @names; my %tree; while ( ) { chomp; my ( $id, $parent, $name) = (split ' ', $_, 5)[ 2, 3, 4]; $names[ $id] = $name; if ( $parent ) { push @{ $tree{ $names[ $parent]} }, $name; } } print_tree( 'Animals', \ %tree, 0); exit; use constant INDENT => ' '; sub print_tree { my ( $root, $tree, $level) = @_; print INDENT x $level, $root, "\n"; for ( @{ $tree->{ $root} } ) { print_tree( $_, $tree, $level + 1); } } __DATA__ Edit Delete 1 0 Animals Edit Delete 2 1 Mammals Edit Delete 3 1 Fish Edit Delete 4 2 Dog Edit Delete 5 2 Cat Edit Delete 6 3 Fresh Water Edit Delete 7 3 Salt Water Edit Delete 8 7 Sharks Edit Delete 9 7 Small Critters