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);