use strict; use warnings; use Data::Dump::Streamer; my @list1 = qw/Truck Car Byke/; my @list2 = qw/Truck Car Scooter/; my @list3 = qw/Truck Trailer Skates/; my %tree; for my $list (\@list1, \@list2, \@list3, ) { my $node = \%tree; $node = $node->{shift @$list} ||= {} while @$list; } Dump \%tree; #### $HASH1 = { Truck => { Car => { Byke => {}, Scooter => {} }, Trailer => { Skates => {} } } };