in reply to Scoping the regex memory variables and where do I go next

If you are asking "Why do the localized variables receive copies of the values from the outer scope?" I would suggest it is because of common situations like:
if (/\$(\d+\.\d+)/) { if ($1 > 1) { $donut_price = $1; } }
So, if $1 mysteriously "disappeared" by the time you tried to make an assignment, what use would $1 be?

Your use of a split(), however, is a scary sight to behold. You would probably be better off using a regexp on its own, and checking if the regexp passes or fails each time. This would avoid using $1, and would avoid the scoping problem. Use while{} instead of split.

Avoiding $1 is easy if you assign to an array:        ($foo) = /...(\d+).../; If the match passes, but some of your memorizations are conditional (i.e. /()?/), then some of the array members might be undef, which is what you'd expect. It is still a true assignment, though, so the while will proceed as planned.