use strict; use warnings; use Data::Dumper; my $data = '[-3|1|29x250+46+26|200+300+464|Get][-3|1|29x250+46+26|132+100+244|come][-3|1|29x250+46+26|220+124+432|Go]'; my @splitted = map { [ split /\+/, (split /\|/)[3] ] } split /]\[/, $data; print Dumper \@splitted; #### $VAR1 = [ [ '200', '300', '464' ], [ '132', '100', '244' ], [ '220', '124', '432' ] ];