sub create_iterator{ my $val = shift; return sub { return $val += 2;} } my $iter_even = create_iterator(0); my $iter_odd = create_iterator(1); #### sub create_iter { my ($code_ref, @rest) = @_; return sub {$code_ref->();} } #### my $even = create_iter(sub {my $c; $c += 2; return $c;}, 0); # Does NOT work #### use strict; use warnings; sub create_iter { my ($code_string, @rest) = @_; eval $code_string; } my $fibonacci = create_iter ( ' return sub {my ($c, $d) = @rest; my $e = $c + $d; @rest = ($d, $e); return $e;} ', 1, 1); print "Fibonacci numbers: \n"; print $fibonacci->(), " ", for 1..7; #### Fibonacci: 2 3 5 8 13 21 34 #### my $fact = create_iter (<<'EOS' return sub { $rest[0]++; $rest[1] *= $rest[0];}; EOS , 1, 1); print "\n\nFact: \n"; print $fact->(), " ", for 1..5; #### Fact: 2 6 24 120 720