use strict;
use warnings;
use Data::Dump 'dd';
my $s = "a aa aaa aaaa";
$s =~ /(?a+) (?a+) (?:(?a+)bbb)?/;
dd \@{^CAPTURE}; # all captured groups
dd $+{a}; # leftmost defined "a"
dd ${^CAPTURE}{a}; # ditto
dd $-{a}; # all defined "a"'s groups
dd ${^CAPTURE_ALL}{a}; # ditto
__END__
["a", "aa"] # correct
"a" # correct
undef
["a", "aa", undef]
"a"