use Data::Dumper; use Data::Diver qw(DiveRef DiveVal); my $foo = "a:b:c:d:a"; my $bar = "a:b:c:d:z"; my $hoh = {}; sub add_item { my $href = shift; my $str = shift; my @keys= split /:/, $str; my $last= pop @keys; push @{ DiveVal( $href, \( @keys ) ) }, [ $last, $str ]; return; } add_item($hoh, $foo); add_item($hoh, $bar); print Dumper($hoh);