Ah, I think I see (again). So, in the for loop, $_ is an alias to the same memory location as the element in the list being looped over. If that memory location is occupied by something that is semantically an lvalue, then $_ behaves as if it were a C pointer, which is to say, behaves just like the thing it's pointing to. If the memory location is not an lvalue, then $_ does not behave like a C pointer, but still behaves like the thing it's pointing to.
Is that right?
I have to stop trying to understand the mechanics of Perl in terms of C.
<Insert Yoda quote here.>
So, $_ is imbued with the semantic context of the thing that occupies the memory location to which it points. Still thinking in C, clearly ...