use strict; use warnings; use Data::Dumper; use Regexp::Common qw/balanced/; my $string = "<*2>FOO<2,1>,<*3>(SigB<8:0:2>,BAR),<*2>Siga<2:0>,Sigb<8,7,6,5,0>"; print "$string\n"; my @parts = $string =~ m/(?:$RE{balanced}{-parens=>'()<>'}|[^,<(]+)+/g; print Dumper(\@parts); #### <*2>FOO<2,1>,<*3>(SigB<8:0:2>,BAR),<*2>Siga<2:0>,Sigb<8,7,6,5,0> $VAR1 = [ '<*2>FOO<2,1>', '<*3>(SigB<8:0:2>,BAR)', '<*2>Siga<2:0>', 'Sigb<8,7,6,5,0>' ];