http://qs321.pair.com?node_id=413685


in reply to Re: Recursively search nested hash/array structures
in thread Recursively search nested hash/array structures

Thank you. Data::Rmap was exactly what I needed. The example script below converts every value corresponding to a key of 'b' to an array unless it already is an array.
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);
Output:
$VAR1 = { 'a' => { 'b' => [ 1 ], 'x' => 3 }, 'b' => [ 1 ], 'c' => { 'd' => [ { 'b' => [ 3 ] }, { 'b' => [ 5, 6, 7 ] }, { 'x' => 3 } ] } };