in reply to variation on splitting a string into elements of an array
in thread splitting a sequence using unpack

A variation that doesn't use unpack:

@triplets0 = $line =~ /(...)/g; @triplets1 = substr($line, 1) =~ /(...)/g; @triplets2 = substr($line, 2) =~ /(...)/g;

or even

push(@triplets, [ substr($line, $_) =~ /(...)/g ]) for 0..2;

Finally, a solution for arbitrary group sizes:

$group_size = 3; push(@groups, [ substr($line, $_-1) =~ /(.{$group_size})/g ]) for 1..$group_size;

If you don't care to group them, remove the square brackets.

Test:

$line = 'atccatccctttaat'; push(@triplets, [ substr($line, $_) =~ /(.{$_})/g ]) for 0..2; require Data::Dumper; print(Data::Dumper::Dumper(\@triplets)); __END__ output ====== $VAR1 = [ [ 'atc', 'cat', 'ccc', 'ttt', 'aat' ], [ 'tcc', 'atc', 'cct', 'tta' ], [ 'cca', 'tcc', 'ctt', 'taa' ] ];