my $tree = 'Foo::Bar::Baz'; my %pkg; my $ref = \%pkg; for(split /::/,$tree){ $ref = exists $ref->{$_} ? # we don't need no autivivification ( $ref->{$_} = {} ) : $ref->{$_} } use Data::Dumper; warn Dumper(\%pkg);