#!/usr/bin/perl use strict; use Data::Dump 'dd'; my $tree = [ 1, [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]] ]; #my $T = get_tree_iterator($tree); #my $T = get_tree_iterator_explicit($tree); #my $T = get_tree_iterator_2($tree); my $T = get_tree_iterator_2_explicit($tree); while (my $leaf = $T->()) { print "leaf: $leaf\n"; } sub get_tree_iterator { my @stack = (shift); return sub { print "---\n"; dd \@stack; while (@stack and ref $stack[0] eq 'ARRAY') { unshift @stack, @{shift @stack}; dd \@stack } return shift @stack; } } sub get_tree_iterator_explicit { my @stack = (shift); return sub { print "---\n"; dd \@stack; while (@stack and ref $stack[0] eq 'ARRAY') { print " split tree into left & right\n"; unshift @stack, @{shift @stack}; dd \@stack } return shift @stack; } } sub get_tree_iterator_2 { my @rtrees = (shift); my $tree; return sub { $tree = pop @rtrees; print "---\n"; print "tree: "; dd $tree; print "rtrees: "; dd \@rtrees; ($tree, $rtrees[@rtrees]) = @$tree while ref $tree; return $tree; } } sub get_tree_iterator_2_explicit { my @rtrees = (shift); my $tree; return sub { $tree = pop @rtrees; print "---\n"; print "tree: "; dd $tree; print "rtrees: "; dd \@rtrees; while (ref $tree) { print "traverse L\n"; ($tree, $rtrees[@rtrees]) = @$tree; print " tree: "; dd $tree; print " rtrees: "; dd \@rtrees; } return $tree; } }