in reply to Modifying $_ in foreach (%hash)

I believe that your first question is answered in the third paragraph of "foreach loops" section of perlsyn.
If any element of LIST is an lvalue, you can modify it by modifying VAR inside the loop. Conversely, if any element of LIST is NOT an lvalue, any attempt to modify that element will fail...
Note that hash keys are not lvalues.
Bill