good chemistry is complicated, and a little bit messy -LW |
|
PerlMonks |
Re^4: Tell me how it works!by gone2015 (Deacon) |
on Jan 28, 2009 at 16:56 UTC ( [id://739641]=note: print w/replies, xml ) | Need Help?? |
But, I read somewhere that assigning the typeglob(*a) will make both to point the same location(address/ memory). That is incomplete... Update: the more accurate answer is that yes, *a and *b end up as pointing to the same location, but what that location contains is a set of pointers, one for each type of value. (I'm sorry, I had previously left out one level of indirection.) The typeglob *a implicitly points a structure which contains, amongst other things: a pointer to the SCALAR value $a; a pointer to the ARRAY value @a; a pointer to the HASH value %a; etc. When you use $a you are implicitly using the SCALAR value pointed to by the respective pointer in the structure refered to by *a. (There is are two implicit dereferences.) The assignment *b = *a makes them both point to the same set of pointers to values. So, $a and $b now implicitly refer to the same value (the same location in memory). So changing $a changes $b. And similarly for @a and @b, %a and %b, and so on. So, undef *a wipes out its pointer to the structure containing the pointers to the values. It does not wipe out that structure or the values it points to. The glob *b still points at the structure, and hence to values that *a used to point to, so it and those values remain unchanged. The typeglob *a contains, amongst other things: a pointer to the SCALAR value $a; a pointer to the ARRAY value @a; a pointer to the HASH value %a; etc. When you use $a you are implicitly using the SCALAR value pointed to by the respective pointer in *a. (There is an implicit dereference.) The assignment *b = *a copies the pointers. So, $a and $b now implicitly refer to the same value (the same location in memory). So changing $a changes $b. And similarly for @a and @b, %a and %b, and so on. Or, in other words, $a and $b are aliases of each other. So, undef *a wipes out its pointers. It does not wipe out the values. The glob *b still points at the values that *a used to point to, so it and those values remain unchanged.
In Section
Seekers of Perl Wisdom
|
|