"a" =~ /((a)*)*/ and printf("1:%s, 2:%s\n", defined($1) ? "'$1'" : "undef", defined($2) ? "'$2'" : "undef", ); "ab" =~ /((a)|(b))*/ and printf("1:%s, 2:%s, 3:%s\n", defined($1) ? "'$1'" : "undef", defined($2) ? "'$2'" : "undef", defined($3) ? "'$3'" : "undef", );