alex5161 has asked for the wisdom of the Perl Monks concerning the following question:
My issue is that the perl script (as I have done it so far) created empty branches when I try to check some branches on existence.
I am using multydimentional hashes: found it as the best way for information that I need to handle. Saing multidimentional I means hash of hashes ... So, I have
$hsh{k1}{k2}{k3}{k4}=v1; $hsh{k1}{k9}{k3}{k33}=v2; ....
In some point I need to check some 'set of keys' on existence in the hash. So, I check:
if ( $hsh{ch1}{ch2}{ch3} ) { ...something... }
And, suddenly I've realized, that such check creates the intermediate branches to access the final one for checking!
So, if there is no $hsh{ch1} before the check, it will be created to access the key 'ch2', which will be created to access the 'ch3'
QUESTION: Is there a way to avoid such aromatic creation ????
Logically, I would expect the Perl to get FALSE as soon as any key is not exist in the hash, but it is not happening!
Sure I could do:
if ( $hsh{ch1} && $hsh{ch1}{ch2} && $hsh{ch1}{ch2}{ch3} ) {...}
but it is so annoying, especially when I have many hashes with 7- 10 keys!
I have creates some function to check a hash 'reasonably', sending hash reference and array of keys to be checked, and it works fine, but it is slows down the processing visibly.
Here is an example of what I am talking about:
DB<4> $h{a}{b}=[1,2]; $h{a}{c}=[3,4] #hash with two elements (array +s) and in 2 levels DB<5> use Data::Dumper #good way to display DB<6> p Dumper\($a,%h) $VAR1 = \undef; $VAR2 = { 'a' => { 'c' => [ 3, 4 ], 'b' => [ 1, 2 ] } }; DB<7> p 'da' if !$h{p}{m} #checking for an existent keys and elemen +t da DB<8> p Dumper\($a,%h) $VAR1 = \undef; $VAR2 = { 'p' => {}, # <<== created one !!! 'a' => { 'c' => [ 3, 4 ], 'b' => [ 1, 2 ] } }; DB<9> delete $h{p}
Once again: Is there a way to avoid such behavior without creating additional function?
Thanks!
|
|---|