sub _upto (&) { return $_[0]; } # prototype & is for a function paramsubupto{
my ($start, $end) = @_;
my $n = $start;
return _upto {
returnwantarray ? $start .. $end :
$n > $end ? ($n = $start, ()) :
$n++
;
};
}
my $it = upto(3, 5);
foreach ( $it->() ) { print' ' . $_ }
Sub upto generates an anonymous sub that is a closure over parameters $start and $end. To work in a foreach each loop, inner sub upto must be predeclared to take an anonymous sub argument; hence the (%). See demo for more detail.