use Data::Dumper; sub mk_chunker { my $n = shift; die unless $n > 0; my $sub; return $sub = sub { return \@_ if @_ < $n; return ( [ @_[0..$n-1] ], $sub->(@_[$n..$#_]), # recursion ); }; } *chunk_5 = mk_chunker(5); print Dumper chunk_5('a' .. 'z'); #### use 5.016; sub mk_chunker { my $n = shift; die unless $n > 0; return sub { return \@_ if @_ < $n; return ( [ @_[0..$n-1] ], __SUB__->(@_[$n..$#_]), # recursion ); }; }