#!/usr/bin/perl -w use strict; use Data::Dumper; use Test::More tests => 1; my $element = { 'check' => { 'field' => 'OLK_BO_BK_TYPE' }, 'type' => 'case', 'case' => [ { 'value' => '1', 'resultset' => 'BROKER' }, { 'value' => '3', 'resultset' => { 'field' => 'OLK_BO_BK_DESC' }, }, ] }; my $expected = { 'check' => 'OLK_BO_BK_TYPE', 'type' => 'case', 'case' => [ { 'value' => '1', 'resultset' => 'BROKER' }, { 'value' => '3', 'resultset' => 'OLK_BO_BK_DESC', }, ] }; hash_walk($element); is_deeply( $element, $expected, "hash_walk worked as expected"); sub hash_walk { my ( $element, $extra ) = @_; my ( $parent, $pkey ); if ($extra) { $parent = $extra->{parent}; $pkey = $extra->{key}; } if ( ref($element) =~ /HASH/ ) { foreach my $key ( keys %$element ) { if ( $key =~ /field/ ) { if ( ref($parent) eq 'HASH' ) { $parent->{$pkey} = $element->{$key}; } elsif ( ref( $parent eq 'ARRAY' ) ) { $parent->[$pkey] = $element->{$key}; } else { warn("I don't know what to do with field in parent[$parent]" ); } } else { hash_walk( $element->{$key}, { parent => $element, key => $key } ); } } } elsif ( ref($element) =~ /ARRAY/ ) { my $upper = @$element - 1; foreach my $i ( 0 .. $upper ) { my $index = $element->[$i]; hash_walk( $index, { parent => $element, key => $i } ); } }