for my $pos (keys %map) { add_solutions($pos, $dict); } my %seen; sub add_solutions { my ($node, $tree) = @_; local $seen{$node} = 1; my $char = $board{$node}; $tree = $tree->{$char} or return; push @solutions, $tree->{word} if $tree->{word}; for my $new_node (grep not $seen{$_}, @{$map{$node}}) { add_solutions($new_node, $tree); } }