#!/usr/bin/perl -w my $tree={}; # warning: recursive subroutine sub insert { my ($tree,$val,@keys)=@_; my $key=shift @keys; unless (defined($tree->{$key})) { $tree->{$key}={}; } if (scalar @keys) { insert($tree->{$key},$val,@keys); } else { $tree->{$key}=$val; } } insert($tree,'1',qw(a b c d)); # test 1 insert($tree,'2',qw(a b d e)); # test 2 insert($tree,$val,split(':',$key); # the call you were looking for.