in reply to how extract and group data in a array

I used the range operator approach like Athanasius but, to avoid keeping track of state, inside a grep feeding into a join with nuls then a couple of splits, one breaking the string into chunks between the 'D' and the 'M', the other inside a map breaking each chunk into an array ref.

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 } ] );

The output.

@AoA = ( [ 'M', '1', '1', '3', '4', 'D' ], [ 'M', '3', '3', '4', 'D' ], [ 'M', '3', '3', '3', 'D' ] );

A bit convoluted I suppose.

Cheers,

JohnGG