sub analyze { my $htree = shift; my $rul = shift; my $hist = (split /\n/, $htree->data)[0]; my $str = (split /\|/, $hist)[0]; my ($k, $v); $hist = "|$hist"; while(($k,$v) = each %$rul) { my @out = @{&proccode($str,$v)}; for my $h (@out) { if($hist !~ /\|$h\|/) { my $new = $htree->append("$h$hist\n$k"); &analyze($new,$rul); # PROBLEM: the @out loop is iterated again # even a 'next' does not force it to increment/end } } } } #### ... my @rules = keys %$rul; for my $k (@rules) { my @out = @{&proccode($str,$$rul{$k})}; ...