sub tree_iterator { return undef unless @stack; my $tos = pop @stack; return $tos unless ref $tos eq 'ARRAY'; my ($L, $R) = @$tos; print "ENTER ($L, $R)\n"; while (1) { print "LOOP: ($L, $R)\n"; push @stack, $R if defined $R; if (defined $L) { return $L if ref $L ne 'ARRAY'; ($L, $R) = @$L; redo; } else { ($L, $R) = @{pop @stack}; } } }