my %result = (); foreach my $line () { chomp $line; my ($index, $value) = split(/ /, $line, 2); my $temp = \%result; foreach my $path (split (//, $index)) { $temp = $temp->{$path} ||= {} } $temp->{''} = [$index, $value]; }