in reply to RegEx: How to negate more than one character?

I think

my $re = qr/(?:[^ab][^h])|(?:[^ab][h])|(?:[ab][^h])/;
does what you want. That technique will get awkward quickly as more excluded combinations are added.

Matching a longer string will nearly always succeed unless you anchor the match to some expected position or embed it in a larger expression. You may want to consider negative matching,

$string !~ /[ab]h/;
for detecting strings which contain no example of 'ah' or 'bh'.

After Compline,
Zaxo