my $i; my @ar = 0 .. 10; ($get_idx_grp, $fin_idx_grp) = mk_idx_funcs( 4, \$i, \@ar ); for ( $i = 0; $i < @ar; ++$i) { my @idx = &$get_idx_grp; $ar[ $idx[0] ] = "YYY"; &$fin_idx_grp; } sub mk_idx_funcs { # XXX bad name my ( $grp_size, $iter, $array ) = @_; my ( @group, $group_end ); my $first_call = 1; return ( sub { if ($first_call) { $first_call = 0; $group_end = $$iter + $grp_size; } if ( $$iter < $group_end and $$iter < @$array ) { push @group, $$iter; no warnings; next unless @group==$grp_size or $$iter==@$array-1; } return @group; }, sub { $group_end += @group; @group = (); return; } ); }