in reply to Re: Recursive data structure munging - arrayrefs to hashrefs
in thread Recursive data structure munging - arrayrefs to hashrefs

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!

Replies are listed 'Best First'.
Re^3: Recursive data structure munging - arrayrefs to hashrefs
by tybalt89 (Monsignor) on Aug 31, 2017 at 20:16 UTC

    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" => [ ] } }

        Just a little glitch ( I blame inadequate test cases - hehehe )

        I also added a fake name generator for anon hashes without a name.

        #!/usr/bin/perl # http://perlmonks.org/?node_id=1198452 use strict; use warnings; my $foo = { "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" => [ ] } }; my $missing = 'name000001'; sub fix { my ($obj, $inarray) = @_; if( 'HASH' eq ref $obj ) { if( $inarray ) { return ($obj->{name} // $missing++) => { map fix($_, 0), %$obj } +; } else { return { map fix($_, 0), %$obj }; } } elsif( 'ARRAY' eq ref $obj ) { return { map fix($_, 1), @$obj } } else { return $obj; } } use Data::Dump 'pp'; print "before:\n"; pp $foo; my $newfoo = fix($foo); print "after:\n"; pp $newfoo;