tart has asked for the wisdom of the Perl Monks concerning the following question:
But I want the container hash to look like this,$VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Calculator' }; $VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Calculator/Budget +' }; $VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Calculator/Budget +/Account' };
$VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Calculator' }; $VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Budget' }; $VAR1 = { 'KEYS' => 'APPLICATION_SERVER/SERVICE_LIST/Account' };
my $source = getHash(); my %container; tie %container,'Tie::IxHash'; walkHash($source, \%container); sub walkHash { my $h = shift; my $container = shift; foreach my $key (keys %$h) { if($key ne 'Leaf' && ref $h->{$key} ) { $container->{KEYS} = "$container->{KEYS}/$key" if(exists $container->{KEYS}); $container->{KEYS} = $key unless(exists $container->{KEYS}); walkHash($h->{$key}, $container); } else { #Process hash under 'LEAF' key here. print Dumper($container); } } } sub getHash { my %hash = ( 'APPLICATION_SERVER' => { 'SERVICE_LIST' => { 'Account' => { 'Leaf' => { 'EXECUTION' => { 'VALUE' => 'EMPTY' }, 'MODULE' => { 'VALUE' => 'w.exe' }, 'APPLICATION' => { 'VALUE' => 'EMPTY', 'Id' => 'Account', 'Parent' => 'w.default' }, 'PATH' => { 'VALUE' => '$(res.home)acc' } } }, 'Calculator' => { 'Leaf' => { 'EXECUTION' => { 'VALUE' => 'EMPTY' }, 'MODULE' => { 'VALUE' => 'x.exe' }, 'APPLICATION' => { 'VALUE' => 'EMPTY', 'Id' => 'Calculator', 'Parent' => 'w.default' }, 'PATH' => { 'VALUE' => '$(res.home)$(res.slash)cal' } } }, 'Budget' => { 'Leaf' => { 'EXECUTION' => { 'VALUE' => 'EMPTY' }, 'MODULE' => { 'VALUE' => 'w.exe' }, 'APPLICATION' => { 'VALUE' => 'EMPTY', 'Id' => 'Budget', 'Parent' => 'w.default' }, 'PATH' => { 'VALUE' => '$(res.appl)$(res.slash)bud' } } }, } } ); return \%hash; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Process hash
by Eliya (Vicar) on Mar 17, 2011 at 09:18 UTC |