use Data::Dumper; my $base_hash = {}; while () { chomp; my @keys = split ':'; my $val = pop @keys; my $hashp = $base_hash; for my $key (@keys) { unless (exists $hashp->{$key}) { $hashp->{$key} = {}; } $hashp = $hashp->{$key}; } $hashp->{"VAL"} = $val; } print Dumper $base_hash; __DATA__ global:2:3:4:LINE1 global:2:3:4:5:LINE2 ########## Output ########## $VAR1 = { 'global' => { '2' => { '3' => { '4' => { 'VAL' => 'LINE1', '5' => { 'VAL' => 'LINE2' } } } } } };