sub parts { my ( $cnt, $ra_out, $ra_val, $ra_in ) = @_; if( $#$ra_val != $cnt ){ #working array not full if( $#$ra_in > -1 ){ #fill it up push(@$ra_val, shift(@$ra_in)); parts( $cnt, $ra_out, $ra_val, $ra_in ); } else { #done with list return; } } else { push(@$ra_out, join('',@$ra_val)); #add to output array, joined ltr string shift(@$ra_val); #rip off first ltr push(@$ra_val, shift(@$ra_in)) if($#$ra_in > -1); #add new ltr, if any remaining parts( $cnt, $ra_out, $ra_val, $ra_in ); } } my @in = split( '', "computer" ); # input array of individual letters my @out; # out array of strings each of $cnt+1 ltrs my @val; # working array of individual letters, $cnt+1 elements parts( 2, \@out, \@val, \@in ); #results in @out