Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: Reading an arbitrary hierarchy into a hash tree

by abstracts (Hermit)
on Aug 06, 2001 at 23:06 UTC ( #102647=note: print w/replies, xml ) Need Help??

in reply to Reading an arbitrary hierarchy into a hash tree


Here is one way to do it. It basically uses a stack to keep pointers to the last hash created. Initially, we add a hash ref to it. For every line in our data, we count how many tabs are prepended. This tells us how deep we are in the tree and the stack should be shortened accordingly (pointers from the previous subtree are removed). This data line is then added to the hash pointed to by the last item in the stack. It is also pushed to the stack to make it the new root.

Try tracing the code to see exactly how it works. Btw, empty hashes are used as values of leaf nodes instead of empty strings. Modifying the code to do that should not be hard.

Hope this helps,,,


PS. Convert the spaces in the __DATA__ to appropriate tabs.

use Data::Dumper; my @stack; my %hash; push @stack, \%hash; while(<DATA>){ chomp; s/^(\t*)//; splice @stack, length($1)+1; push @stack, $stack[$#stack]->{$_} = {}; } print Dumper(\%hash); __DATA__ foo sub1 sub2 sub21 sub22 bar camel
Here is the dump:
$VAR1 = { 'foo' => { 'sub1' => {}, 'sub2' => { 'sub21' => {}, 'sub22' => {} } }, 'bar' => { 'camel' => {} } };

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (3)
As of 2019-02-17 10:15 GMT
Find Nodes?
    Voting Booth?
    I use postfix dereferencing ...

    Results (96 votes). Check out past polls.