http://qs321.pair.com?node_id=229940


in reply to Re: Autovivification with hash of hashes
in thread Autovivification with hash of hashes

I am quite confused with your second piece of code. What does it try to demo? What is your expected result (to print out the "popped into existence" or not, I tested it, and it printed)?

Also I don't know whether you realize that you actually used the concept of symblic reference in your second demo.

I changed your second demo a little bit, and added comments to explain:
use strict; #this basically disallows symblic ref use warnings; my %foo; $foo{bar} = "key bar's value"; #now you made $foo{bar} EXISTS, there i +s no need for auto-vivification to create it any more. MOST IMPORTANT +LY, this can be a symblic reference depending on how you use it, cont +inue... if(exists($foo{qux})) { print "\$foo{qux} exists"; } if(ref $foo{bar} eq 'HASH' && exists($foo{bar}{baz})) {#Here you are s +trongly suggesting a symblic reference. As for the code, the part bef +ore && obviously evaluate to false, so that exists after && will be e +valuated, but no auto-vivfication here, as $foo{bar} exists any way print "\$foo{bar}{baz} exists\n";#will not print as there is no $f +oo{bar}{baz} } if(exists($foo{bar})) {#yes print "\$foo{bar} popped into existence\n";#print out, but not pop +ped into existence, it is actually created by you } #the following is added by me $foo{bar}{baz} = 1; #violates strict refs, error, because you set $foo +{bar} to a string earlier. There is no way to create $foo{bar}{baz} i +n this context, unless you turn off use strict("refs")
update:

Yes, Aristotle is right, and I messed up with && and ||, Thanks for pointing out.

However this mistake does not reduce the value of this post, and the post as a whole is still correct, especially the discussion on symbolic reference.

I keep the mistake there (Remove the original mistake pointed out by other monks, would make other monk's reply funny, and sounds like irrelevant, and I don't do this ;-)

"And the latter is exactly what he's talking 
about protecting against by using ref."
Doubt.