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.