#!/usr/bin/perl -w use strict; use Data::Dumper; my %result; for my $l () { my ($cod,$desc) = ($l =~/(\d*) (.*)/); my $hashref = \%result; my $partial = ''; foreach my $layer (split //, $cod) { $partial .= $layer; $hashref = ($hashref->{$partial} ||= {}); } $hashref->{0} = $desc; } 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