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

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;

Replies are listed 'Best First'.
Re^6: Recursive data structure munging - arrayrefs to hashrefs
by flightdm (Acolyte) on Aug 31, 2017 at 21:13 UTC
    You, my good man, get my last vote of the day. :) Thank you so much, what a great solution!