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;