The only problem is that this implementation requires the keys to be reverse sorted (longest to shortest-- remove the "reverse" on the sort and it breaks). To handle unordered names, try this (note: I eliminated the replication of parent hash node keys, as a personal preference):
use strict; use Data::Dumper; $Data::Dumper::Indent=1; my %hash = ( "Foo" => 1, "Foo::Bar::Poo" => 1, "Foo::Bar" => 1, "Foo::Beer" => 1, "Foo::Beer::Nuts" => 1, "Foo::Beer::Nuts::Hmmm" => 1, "Foo::Bar::AgainHmmm" => 1, ); print Data::Dumper->Dump([\%hash], [qw(%hash)]); my %newhash; foreach (keys %hash) { my @l = split /::/, $_; my $path = ''; my $newhashref = \%newhash; for (my $ii = 0; $ii < @l; $ii++) { if (not exists ${$newhashref}{$l[$ii]}) { if ($ii < (@l - 1)) { ${$newhashref}{$l[$ii]} = {}; } else { ${$newhashref}{$l[$ii]} = 1; } } else { if (($ii < (@l - 1)) && (${$newhashref}{$l[$ii]} == 1)) { ${$newhashref}{$l[$ii]} = {}; } } $newhashref = (${$newhashref}{$l[$ii]}); } } print Data::Dumper->Dump([\%newhash], [qw(%newhash)]); __END__ --- $Bill Luebkert <[EMAIL PROTECTED]> wrote: > Martin Moss wrote: > <original text elided> > > It would be hard to build on the fly since you don't > know the depth yet. You > need to either re-structure the final hash or sort > when complete. > > use strict; > use Data::Dumper; $Data::Dumper::Indent=1; > > my %hash = ( > Foo => 1, > Foo::Bar => 1, > Foo::Bar::Poo => 1, > Foo::Beer => 1, > Foo::Beer::Nuts => 1, > Foo::Beer::Nuts::Hmmm => 1, > Foo::Bar::AgainHmmm => 1, > ); > print Data::Dumper->Dump([\%hash], [qw(%hash)]); > > my %newhash; > foreach (reverse sort keys %hash) { > > my @l = split /::/, $_; > > my $path = ''; > for (my $ii = 0; $ii < @l; $ii++) { > > $path .= "'}{'" if $path; > $path .= join '::', @l[0..$ii]; > > my $exists = eval "exists \$newhash{'$path'}" || > 0; > if (not $exists) { > if ($ii < scalar @l - 1) { > eval "\$newhash{'$path'} = {}"; > } else { > eval "\$newhash{'$path'} = 1"; > } > } > > } > } > print Data::Dumper->Dump([\%newhash], > [qw(%newhash)]); > > __END__ __________________________________ Do you Yahoo!? Yahoo! Calendar - Free online calendar with sync to Outlook(TM). http://calendar.yahoo.com _______________________________________________ Perl-Unix-Users mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs