in reply to Recursive data structure munging - arrayrefs to hashrefs

Try this, I had to fix your initial data. this outside braces were wrong.

#!/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;

Outputs:

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, }, }

Replies are listed 'Best First'.
Re^2: Recursive data structure munging - arrayrefs to hashrefs
by flightdm (Acolyte) on Aug 31, 2017 at 20:10 UTC
    The output ends up looking like this:
    Use of uninitialized value in anonymous hash ({}) at /Users/ben/Work/c +ert/mine/restruct line 33, <$fh> line 1. Odd number of elements in anonymous hash at /Users/ben/Work/cert/mine/ +restruct line 33, <$fh> line 1. Use of uninitialized value in anonymous hash ({}) at /Users/ben/Work/c +ert/mine/restruct line 33, <$fh> line 1. Odd number of elements in anonymous hash at /Users/ben/Work/cert/mine/ +restruct line 33, <$fh> line 1. Use of uninitialized value in anonymous hash ({}) at /Users/ben/Work/c +ert/mine/restruct line 33, <$fh> line 1. Odd number of elements in anonymous hash at /Users/ben/Work/cert/mine/ +restruct line 33, <$fh> line 1. Use of uninitialized value in anonymous hash ({}) at /Users/ben/Work/c +ert/mine/restruct line 33, <$fh> line 1. Odd number of elements in anonymous hash at /Users/ben/Work/cert/mine/ +restruct line 33, <$fh> line 1. [...] { "" => { items => {} }, "2017-08-30T22:47:28.941Z" => "clusters", "allHostsConfig" => undef, "HASH(0x7f91e29911a8)" => "hosts", "HASH(0x7f91e29c8c18)" => "timestamp", "HASH(0x7f91e29c8f30)" => "hostTemplates", "HASH(0x7f91e29d1720)" => undef, "managementService" => "mgmt", "peers" => {}, [...]
    I see what you're trying to do, though - which gives me lots of ideas. Thank you!

      Show a Data::Dump printout of your data before you run it through fix()
      Or at least a small subset that shows the problem you claim.

        Apologies; I should have done that right off the bat. Here's a subset:
        { "timestamp" => "2017-08-30T22:47:28.941Z", "clusters" => [ { "name" => "ctest-0", "displayName" => "ctest-0", "version" => "CDH5", "fullVersion" => "5.10.0", "services" => [ { "name" => "zookeeper", "type" => "ZOOKEEPER", "config" => { "name" => "scope", "items" => [ ] }, "roles" => [ { "name" => "zookeeper-SERVER-1f4f45808d60aa625175740bb799654b", "type" => "SERVER", "hostRef" => { "hostId" => "c0ffa68b-b606-44df-be2e-49500d929fd5" }, "config" => { "name" => "scope", "items" => [ { "name" => "role_jceks_password", "value" => "elided", "sensitive" => "true" }, { "name" => "serverId", "value" => "1", "sensitive" => "false" } ] }, "roleConfigGroupRef" => { "roleConfigGroupName" => "zookeeper-SERVER-BASE" } }, { "name" => "zookeeper-SERVER-a6d8e17e16ad7f53a6a495c22cd7c044", "type" => "SERVER", "hostRef" => { "hostId" => "59df5f26-4300-4ffe-a04f-56ada4534892" }, "config" => { "name" => "scope", "items" => [ { "name" => "role_jceks_password", "value" => "elided", "sensitive" => "true" }, { "name" => "serverId", "value" => "3", "sensitive" => "false" } ] }, "roleConfigGroupRef" => { "roleConfigGroupName" => "zookeeper-SERVER-BASE" } }, { "name" => "zookeeper-SERVER-a907210f06d89d5a30ec8f87e0a99117", "type" => "SERVER", "hostRef" => { "hostId" => "465ebec4-cd3b-4775-92ee-1322f446eb89" }, "config" => { "name" => "scope", "items" => [ { "name" => "role_jceks_password", "value" => "elided", "sensitive" => "true" }, { "name" => "serverId", "value" => "2", "sensitive" => "false" } ] }, "roleConfigGroupRef" => { "roleConfigGroupName" => "zookeeper-SERVER-BASE" } } ], "displayName" => "ZooKeeper", "roleConfigGroups" => [ { "name" => "zookeeper-SERVER-BASE", "displayName" => "Server Default Group", "roleType" => "SERVER", "base" => "true", "serviceRef" => { "clusterName" => "ctest-0", "serviceName" => "zookeeper" }, "config" => { "name" => "scope", "items" => [ { "name" => "zookeeper_server_java_heapsize", "value" => "1073741824", "sensitive" => "false" } ] } } ] } ], "parcels" => [ { "product" => "CDH", "version" => "5.10.0-1.cdh5.10.0.p0.41", "stage" => "DISTRIBUTED", "clusterRef" => { "clusterName" => "ctest-0" } }, { "product" => "CDH", "version" => "5.10.0-1.cdh5.10.0.p0.41", "stage" => "ACTIVATED", "clusterRef" => { "clusterName" => "ctest-0" } } ] } ], "allHostsConfig" => { "name" => "scope", "items" => [ { "name" => "memory_overcommit_threshold", "value" => "0.85", "sensitive" => "false" } ] }, "peers" => [ ], "hostTemplates" => { "name" => "scope", "items" => [ ] } }