This puzzled me the last 15 minutes:
if (\'ab\' =~ /^a|b$/) { print \'t\' } else { print \'f\' }
print \"\\n\";
I have expected that \'a\'
If you group the alternation, then you will get the expected behavior:
/^(a|b)$/
Your regex will find a a at the start of the string (with ^a branch) or b at the end (with the b$ branch).
When you use ^(a|b)$, the anchors are applied to the whole group and thus it will match a string that is equal to a or b.
Also, if you do not really need to capture the value, you may either use a non-capturing group, /^(?:a|b)$/, or a n modifier, /^(a|b)$/n.
Your regexp matched ^a or b$, because the alternative operator | has lower precedence than a sequence of concatenated regexps.
In this particular case (an alternative of single characters) you can simplify it to a class:
/^[ab]$/