You can get an explanation of any regular expression using YAPE::Regex::Explain. In this case, it outputs:
The regular expression:
(?-imsx:^.{!}(.{5}))
matches as follows:
NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
^ the beginning of the string
----------------------------------------------------------------------
. any character except \n
----------------------------------------------------------------------
{!} '{!}'
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
.{5} any character except \n (5 times)
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
The issue is that the $! variable is interpolated to an empty string but ! operator doesn't get interpolated as such in the regular expression. Essentially, your modification is actually looking for the string literal {!}.
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.