my @array_2D = blablabla my ($tree, $tmp); foreach my $row (@array){ $tmp = extend_MTree($row); $tree = add($tmp, $tree); } $tree now contains the hash! sub extend_MTree($) { my ($a) = @_; my %H_tmp; if( $#{$a} == -1) { return 1; } my $elmt = shift @$a; $H_tmp{$elmt} = extend_MTree($a); return \%H_tmp; } sub add() { my ($tmp, $res) = @_; foreach my $key (keys %$tmp) { # this is a new path, add here and leave if(!defined($res->{$key})) { $res->{$key} = $tmp->{$key}; return $res; } # this part of the path exists, recurse $res->{$key} = add($tmp->{$key}, $res->{$key}); return $res; }