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