use strict; use warnings; use Data::Rmap qw(rmap_hash); use Data::Dumper; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Indent = 1; my $data = { a => { b => 1, x => 3, }, b => 1, c => { d => [ { b => 3 }, { b => [5, 6, 7] }, { x => 3}, ], }, }; my $key = 'b'; my @to_fix = rmap_hash { exists($_->{$key}) && (ref($_->{$key}) ne "ARRAY") ? $_ : () } $data; for my $h(@to_fix) { $h->{$key} = [ $h->{$key} ]; } warn Dumper($data); #### $VAR1 = { 'a' => { 'b' => [ 1 ], 'x' => 3 }, 'b' => [ 1 ], 'c' => { 'd' => [ { 'b' => [ 3 ] }, { 'b' => [ 5, 6, 7 ] }, { 'x' => 3 } ] } };