Another possibility:
>perl -wMstrict -le
"for my $s (qw(
B111 B111B111 B111B111B111
A111 A111A111 A111A111A111
A111B111 A111B111A111 A111B111A111B111 A111B111A111B111A111
B111A111 B111A111B111 B111A111B111A111 B111A111B111A111B111
B BB BBB A AA AAA BA BAB AB ABA
xxx xx x), '',
) {
local our $y_n;
()= $s =~ m{ ([AB]) (?{ $y_n = $^N eq 'A' ? 'yes' : 'no' }) }xmsg;
if (defined $y_n) {
printf qq{%3s: '%s' \n}, $y_n, $s;
}
else {
warn qq{no A or B found in '$s'};
}
}
"
no: 'B111'
no: 'B111B111'
no: 'B111B111B111'
yes: 'A111'
yes: 'A111A111'
yes: 'A111A111A111'
no: 'A111B111'
yes: 'A111B111A111'
no: 'A111B111A111B111'
yes: 'A111B111A111B111A111'
yes: 'B111A111'
no: 'B111A111B111'
yes: 'B111A111B111A111'
no: 'B111A111B111A111B111'
no: 'B'
no: 'BB'
no: 'BBB'
yes: 'A'
yes: 'AA'
yes: 'AAA'
yes: 'BA'
no: 'BAB'
no: 'AB'
yes: 'ABA'
no A or B found in 'xxx' at -e line 1.
no A or B found in 'xx' at -e line 1.
no A or B found in 'x' at -e line 1.
no A or B found in '' at -e line 1.
Update: And allowing for the possibility of side-effects (e.g., the values in the %xlat hash could be anonymous subroutine references) (note: //p and ${^MATCH} only available in Perl 5.10+):
>perl -wMstrict -le
"my %xlat = qw(A yes B no);
;;
my $set = join '', map quotemeta, keys %xlat;
$set = qr{ [$set] }xms;
;;
my $xlat_keys = join ' or ', keys %xlat;
;;
for my $s (qw(
B111 B111B111 B111B111B111
A111 A111A111 A111A111A111
A111B111 A111B111A111 A111B111A111B111 A111B111A111B111A111
B111A111 B111A111B111 B111A111B111A111 B111A111B111A111B111
B BB BBB A AA AAA BA BAB AB ABA
xxx xx x), '',
) {
local our $y_n;
use re 'eval';
()= $s =~ m{ $set (?{ $y_n = $xlat{${^MATCH}} }) }xmspg;
if (defined $y_n) {
printf qq{%3s: '%s' \n}, $y_n, $s;
}
else {
warn qq{no $xlat_keys found in '$s'};
}
}
"
no: 'B111'
no: 'B111B111'
no: 'B111B111B111'
yes: 'A111'
yes: 'A111A111'
yes: 'A111A111A111'
no: 'A111B111'
yes: 'A111B111A111'
no: 'A111B111A111B111'
yes: 'A111B111A111B111A111'
yes: 'B111A111'
no: 'B111A111B111'
yes: 'B111A111B111A111'
no: 'B111A111B111A111B111'
no: 'B'
no: 'BB'
no: 'BBB'
yes: 'A'
yes: 'AA'
yes: 'AAA'
yes: 'BA'
no: 'BAB'
no: 'AB'
yes: 'ABA'
no A or B found in 'xxx' at -e line 1.
no A or B found in 'xx' at -e line 1.
no A or B found in 'x' at -e line 1.
no A or B found in '' at -e line 1.