in reply to Re: replace a key with its value
in thread replace a key with its value

In this version I pass around a closure code reference to get evaluated when we find matching fields.

I find this much prettier, since we aren't duplicating the ref code and it simplifies the matching code.

#!/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, $update ) = @_; if ( ref($element) =~ /HASH/ ) { foreach my $key ( keys %$element ) { my $value = $element->{$key}; if ( $key =~ /field/ ) { $update->( $value); } else { hash_walk( $value, sub { $element->{$key} = shift } ); } } } elsif ( ref($element) =~ /ARRAY/ ) { my $upper = @$element - 1; foreach my $i ( 0 .. $upper ) { my $index = $element->[$i]; hash_walk( $index, sub { $element->[$i] = shift } ); } } }