I think you've left out some data... like what is the contents of your variable before the =~. The /m is clearly changing the behavior of the ^, which I am assuming that you are doing this because you are searching through an entire file. Given the m changing the behavior of the ^ it is likely that it is changing to a much more complicated statement than \n. I know the docs state that the ^ and $ become \n or equivalent, but it may evaluate to something much more complicated. Finally you're not really providing context for how you are actually exec'ing this code. I can imagine that if this is within an eval or something, that it would be a hit if every time that it was eval'd it has to interpret the regex... the second regex has much less processing to do than the first one.