#!/usr/bin/perl use warnings; use strict; use Data::Diver qw{ Dive }; my $external_structure = { ... }; my %format = (product_id => ['id'], price_excl_vat => [qw[ data price ]], unit_qty => [qw[ data unit_info qty ]]); # (1) my $internal_structure = {}; for my $key (keys %format) { $internal_structure->{$key} = Dive($external_structure, @{ $format{$key} }); } use Data::Dumper; print Dumper $internal_structure;