use Data::Diver qw(DiveVal); use Data::Dumper qw(Dumper); my $out = {}; for my $nodes_ref ( [qw(a b e d)], [qw(a b c f)], [qw(d h f)], [qw(d i g)], ) { my $leaf_value = pop @{ $nodes_ref }; DiveVal($out, @{ $nodes_ref }) = $leaf_value; } print Dumper $out; __END__ { a => { b => { c => 'f', e => 'd', } }, d => { h => 'f', i => 'g', }, }