On Jan 6, 2004, at 11:50 AM, Simon Cozens wrote:
Jeff Clites:$a = $hash{bar};
Here you used the copy constructor before taking the reference. It might look
like an assignment operator, but it isn't. You're better off thinking that
assignment doesn't exist. It's a copy constructor. It makes the PMC referred
to by $a a copy of the PMC in $hash{bar}. Their values may be "equal" but
they're two different PMCs.
But here what I'm copying is the _contents_ of the hash slot--so I'm copying a PerlString PMC, for instance.
$b = \$hash{bar};
Here you didn't make a copy before taking the reference. No copy, only one
PMC. It all works.
And here I'm not making a copy, but also the thing I'm taking a reference to is not the same thing I copied above. Here, it's a reference to a hash slot.
So maybe the way to think about it is:
$a = $hash{bar};
#This finds the hash slot, pulls out its contents, and copies that contents into $a.
$b = \$hash{bar};
#This finds the hash slot, takes a reference to it, and places that reference in $b.
So the first case involves copying a string, and the second involves creating a reference to a hash slot. In particular, if the hash is initially empty, the first case should end up with undef in $a (so nothing actually copied, if undef is a singleton), but $b would (presumably) still contain a real reference (to a hash slot which doesn't contain anything yet), which would create a hash entry if you "$$b = 'goo'". And that reference-to-a-hash-slot is probably a separate special PMC (it needs to keep track of the hash and key, and work even if the hash is empty).
JEff