use warnings; use strict; use Want 'howmany'; sub multi_iterator { my ($iterator) = @_; return sub { my $context = wantarray(); print "multi_iterator called, <$context>\n"; return unless defined $context; return $iterator->() unless $context; return map { $iterator->() } 1 .. howmany(); }; } sub counter { my ($from, $to, $step) = @_; $step ||= 1; my $value = $from; return sub { print STDERR "counter called, $from / $to / $step / $value\n"; return if $value > $to; my $v = $value; $value += $step; return $v; }; } my $counter = counter(1, 10, 3); my $iterator = multi_iterator($counter); my ($un, $deux) = $iterator->(); my $trois = $iterator->(); print "Hack-27 ", $un, ",", $deux, ",", $trois, "\n"; __END__ multi_iterator called, <1> counter called, 1 / 10 / 3 / 1 counter called, 1 / 10 / 3 / 4 multi_iterator called, <> counter called, 1 / 10 / 3 / 7 Hack-27 1,4,7