use strict; use warnings; my $str = "One:Two:Three:four, One:Two:3:4, One:2:3:4, One:2:three"; my %hash; my @defs = split(/\s*,\s*/, $str); # Use Text::CSV? foreach my $def (@defs) { my @keys = split(/:/, $def); my $val = pop(@keys); my $p = \\%hash; while (@keys) { $p = \($$p->{shift(@keys)}); } $$p = $val; } require Data::Dumper; print(Data::Dumper::Dumper(\%hash)); #### use strict; use warnings; use Data::Diver qw( DiveVal ); my $str = "One:Two:Three:four, One:Two:3:4, One:2:3:4, One:2:three"; my %hash; my @defs = split(/\s*,\s*/, $str); # Use Text::CSV? foreach my $def (@defs) { my @keys = split(/:/, $def); my $val = pop(@keys); DiveVal(\%hash, map { \$_ } @keys) = $val; } require Data::Dumper; print(Data::Dumper::Dumper(\%hash));