my @levels = split /;/, $collect{categories}; for (0 .. $#levels) { $out->{$levels[$_]} = {} unless exists $out->{$levels[$_]}; $out->{$levels[$_]} = $val if $_ == $#levels; } close Fn; } use Data::Dumper; print Dumper($out);