use strict; use Data::Dumper; my $start; sub add{ my $root = shift; my $level = shift; my @items = @_; if(!@items) {return;} #print "level = $level\n"; while(@items) { my $first = shift @items; $root->{$first}->{count}++; #print "\t" x $level . "first = " . $first . ", values = " . join(',',@items)."\n"; add($root->{$first}->{children}, $level+1, @items); } } add($start, 1, 1..3); add($start, 1, 1..2); print Dumper($start); #### $VAR1 = { '1' => { 'children' => { '2' => { 'children' => { '3' => { 'count'=>1} }, 'count' => 2}, '3' => {'count' => 1} }, 'count' => 2 }, '3' => { 'count' => 1 }, '2' => { 'children' => { '3' => { 'count' => 1 } }, 'count' => 2 } };