You could use a canned
/regexp?/i as follows:
use strict;
use warnings;
use Regexp::Common qw(balanced);
my @streams = (
'(aaa) (bbb (ccc( ddd) eee)) (fff)',
' (a) ((bc (d)) ef) h',
'(a)',
'(a) ',
'(a) (bc)',
'',
);
my $PATTERN = $RE{balanced}{-keep};
for my $input (@streams) {
print qq("$input" => );
my @pieces = ($input =~ /$PATTERN/g);
printf qq(%s\n), join qq( ), map {qq("$_")} @pieces;
}
which prints:
"(aaa) (bbb (ccc( ddd) eee)) (fff)" => "(aaa)" "(bbb (ccc( ddd) eee))"
+ "(fff)"
" (a) ((bc (d)) ef) h" => "(a)" "((bc (d)) ef)"
"(a)" => "(a)"
"(a) " => "(a)"
"(a) (bc)" => "(a)" "(bc)"
"" =>
This assumes that you had a typo in your post and you actually want balanced parens. Cheers.