Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Re: Autovivification with hash of hashes

by pg (Canon)
on Jan 26, 2003 at 05:25 UTC ( #229940=note: print w/replies, xml ) Need Help??


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.

Replies are listed 'Best First'.
Re^3: Autovivification with hash of hashes
by Aristotle (Chancellor) on Jan 26, 2003 at 05:34 UTC
    Here you are strongly suggesting a symblic reference. As for the code, the part before && obviously evaluate to false, so that exists after && will be evaluated, but no auto-vivfication here, as $foo{bar} has been created by you earlier

    Actually, a) the ref failing will immediately lead to the entire expression failing because he is using &&, not ||. b) If it got executed, strict would cause the exists to fail with a refs stricture violation.

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

    Makeshifts last the longest.

      Thank you, that is what I was trying to convey.

      I think the most important thing to do when working with structures that may contain anonymous hash refereneces is to avoid using tests that access a possibly non existent hash reference key by name, which, as far as I know, is the only way to cause autovivification. I am not sure what, other then ref could even be used. This link provides some extended examples on the subject.
      Autovivification Explained

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://229940]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2020-07-08 05:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?