use warnings; use strict; use Data::Dumper; my @a; my @b; @a = (1..100); @b = (1..8); print Dumper ( divarray(\@a, \@b) ); @a = (1..5); @b = (1..8); print Dumper ( divarray(\@a, \@b) ); sub divarray { my @a = @{shift @_}; my @b = @{shift @_}; my @c; my $i = 0; my $b = int(@a/@b)+1; for ( @a ) { push @c, [] if $i == 0 or $i % $b == 0; push @{$c[-1]}, $_; $i++; } return \@c; }