The perlre documentation gives no restrictions on contexts in which {^MATCH} can be used, saying only that it's an optimized synonym for $&. And in fact, if I change the first line to use $& instead of {^MATCH}, it behaves as expected. Thank you for any hints!

As a workaround for this problem, Perl 5.10.0 introduces ${^PREMATCH} , ${^MATCH} and ${^POSTMATCH} , which are equivalent to $` , $& and $' , except that they are only guaranteed to be defined after a successful match that was executed with the /p (preserve) modifier.

I think this has to do with optimization of the regexp. I may not be using terminology quite right, but Perl sees that the $sub variable can be interpolated, so the regexp is eval'd at compile time, thereby populating ${^MATCH}. That is, it is only after being eval'd once that ${^MATCH} gets the value from the search.