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' => {} } };