#!/usr/bin/perl # http://perlmonks.org/?node_id=1198452 use strict; use warnings; my $foo = [ { name => 'a', type => 1, rockets => 2, leaves => 3 }, { name => 'b', type => 7, rockets => 4, leaves => 1, samples => [ { name => 'mary', dog => 'fifi' }, { name => 'john', fish => 'oscar' } ] } ]; sub fix { my ($obj) = @_; if( 'HASH' eq ref $obj ) { return $obj->{name} => { map fix($_), %$obj }; } elsif( 'ARRAY' eq ref $obj ) { return { map fix($_), @$obj } } else { return $obj; } } use Data::Dump 'pp'; print "before:\n"; pp $foo; my $newfoo = fix($foo); print "after\n"; pp $newfoo; #### before: [ { leaves => 3, name => "a", rockets => 2, type => 1 }, { leaves => 1, name => "b", rockets => 4, samples => [ { dog => "fifi", name => "mary" }, { fish => "oscar", name => "john" }, ], type => 7, }, ] after: { a => { leaves => 3, name => "a", rockets => 2, type => 1 }, b => { leaves => 1, name => "b", rockets => 4, samples => { john => { fish => "oscar", name => "john" }, mary => { dog => "fifi", name => "mary" }, }, type => 7, }, }