It seems odd that you are doing all this in a substitution rather than iterating over the results of the match, e.g.while ($text =~ /$re/g) {...}, particularly given that you are already resorting to some complex activity including an e modifier. However, you could do this in a fell swoop by capturing the entire block you want to reparse, and using a sub-regex in list context w/ the g modifier to return the full list:

Thanks for this reply. I appreciate the comments and that, even though you had reservations about doing this in production code (which I would too, and this is not!), you had a go at answering the question I asked.

I'll share a bit more, just in case you're wondering what I'm thinking by going with an approach like this. It's really just a personal challenge to see if (and how) I could tackle something a different way than I normally would. Similar to obfu/JAPH/golf in that it's amusing and enlightening. I've never tried anything quite so arcane as to capture every instance of a repeating multi-line pattern within a pattern. I only got so far with it before I got stumped, which is why I naturally came here for sage advice next.

That's the main reason, anyway. The data itself was from a personal engineering project that quite literally exploded (and set off a few car alarms) after I got what I needed out of it. It's hence sort of unlikely I'll ever need to maintain this code, and even then, the much more difficult task would be rebuilding the thing, not to mention the municipal permit. :-)