#!/usr/bin/perl -- use strict; use warnings; use Data::Dumper; 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->{0} = $value; } print Dumper \%result; __DATA__ 1 ITEM 11 Sub Item 1 111 Item X 112 Item 1121 Another Item 11212 And Another Item 12 Sub Item 2 #### 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]; }