use warnings; use strict; use Data::Dumper; my @lists = ([qw/Truck Car Bike/], [qw/Truck Car Scooter/], [qw/Truck Trailer Skates/]); my %tree; for my $list (@lists) { to_tree(\%tree, $list); } print Dumper(\%tree); sub to_tree { my ($head, $list) = @_; my $node = shift @$list; return unless defined $node; $head->{$node} ||= {}; to_tree($head->{$node}, $list); }