use strict; use warnings; use Data::Dumper; my @dd = qw{ AA JJ CC M 1 1 3 4 D JJ 1 1 D M 3 3 4 D C M 3 3 3 D P Z }; my @AoA = map { [ split m{\0} ] } split m{(?<=\0D)\0(?=M\0)}, join qq{\0}, grep { m{^M$} .. m{^D$} } @dd; print Data::Dumper->Dumpxs( [ \ @AoA ], [ qw{ *AoA } ] );