Here is a little script that tells you for each element what it is and how to address it:
use strict;
use warnings;
sub refClean {
my @s = split /\n/, shift;
my $m = 0;
for my $line (@s) {
next unless $line =~ /(.+)#__/;
my $len = length($1);
$m=$len>$m?$len:$m;
}
for my $line (@s) {
next unless $line =~ /(.+)#__/;
my $len = length($1);
$line =~ s/#__/" " x ($m-$len)."#"/e;
}
return join "\n", @s;
}
sub refStructure {
my $element = shift;
my $level = shift;
my $tab = shift;
my $name = shift;
my $s = $tab x $level;
my $ctr = 0;
my $r = ref($element);
if( !$r ) {
$s .= "'$element', #__ scalar: ".$name."\n";
} elsif( $r eq 'HASH' ) {
$s .= "{ #__ ref to hash: ".$name."\n";
for my $key (keys %$element) {
$s .= $tab x ($level+1)."'$key' => ";
$s .= " #__ key of hash, string: +(keys %{".$n
+ame."})[".$ctr++."]\n";
$s .= refStructure( $element->{$key}, $level+2
+, $tab, $name."->{'".$key."'}" );
}
$s .= $tab x $level."}\n";
} elsif( $r eq 'ARRAY' ) {
$s .= "[ #__ ref to array: ".$name."\n";
map { $s .= refStructure( $_, $level+1, $tab, $name."-
+>[".$ctr++."]" ) } @$element;
$s .= $tab x $level."]\n";
+
} else {
$s .= "$r #__ unknown type of reference\n";
}
$s = refClean( $s )."\n" unless $level;
return $s;
}
my $VAR1 = {
'IsLocked' => {},
'ID' => '18827',
'TransactionID' => 'eb8xxx8-xxxb-4xx7-baed-xxx66c790c3',
'Name' => 'Production - xxxx',
'FarmRoleSet' => {
'Item' => [
{
'IsScalingEnabled' => '1',
'ServerSet' => {
'Item' => {
'Uptim
+e' => '1452.4',
'Serve
+rID' => 'xxxxc-487f-9281-0ebf39d2d4ea',
'Statu
+s' => 'Running',
'Exter
+nalIP' => '54.193.71.108',
'Index
+' => '1',
'Inter
+nalIP' => '1.1.11.106',
'Scala
+rizrVersion' => '2.5.2',
'Platf
+ormProperties' => {
+ 'InstanceType' => 'm3.medium',
+ 'InstanceID' => 'i-xxxx43',
+ 'AMIID' => 'ami-xxxxxe97',
+ 'AvailabilityZone' => 'us-west-1b'
+ },
'IsDbM
+aster' => '0'
}
},
'ID' => '68608',
'RoleID' => '62343',
'Platform' => 'ec2',
'CloudLocation' => 'us-west-1',
'Name' => 'prod-app-xxx-v2',
'Category' => 'Application Serv
+ers',
'PlatformProperties' => {
'Instan
+ceType' => 'm3.medium',
'Availa
+bilityZone' => 'x-scalr-diff'
},
'ScalingAlgorithmSet' => {},
'ScalingProperties' => {
'MaxInst
+ances' => '3',
'MinInst
+ances' => '1'
}
},
{
'IsScalingEnabled' => '1',
'ServerSet' => {
'Item' => [
{
'Upt
+ime' => '4438.55',
'Ser
+verID' => 'xxxxx5-cfa7-4ea2-8013-34adxxxxxxx',
'Sta
+tus' => 'Running',
'Ext
+ernalIP' => '999.999.1.187',
'Ind
+ex' => '1',
'Int
+ernalIP' => '999.9.4.162',
'Sca
+larizrVersion' => '2.4.5',
'Pla
+tformProperties' => {
+ 'InstanceType' => 'm3.medium',
+ 'InstanceID' => 'i-e6xxxx9',
+ 'AMIID' => 'ami-94exxx',
+ 'AvailabilityZone' => 'us-west-1b'
+ },
'IsD
+bMaster' => '1'
},
{
'Upt
+ime' => '4428.4',
'Ser
+verID' => 'xxxxx-625f-4afc-b544-68fe0740dc0f',
'Sta
+tus' => 'Running',
'Ext
+ernalIP' => '999.99.34.230',
'Ind
+ex' => '2',
'Int
+ernalIP' => '999.99.3.165',
'Sca
+larizrVersion' => '2.4.5',
'Pla
+tformProperties' => {
+ 'InstanceType' => 'm3.medium',
+ 'InstanceID' => 'i-xxx',
+ 'AMIID' => 'ami-xxx',
+ 'AvailabilityZone' => 'us-west-1b'
+ },
'IsD
+bMaster' => '0'
}
]
},
'ID' => '68609',
'RoleID' => '61944',
'Platform' => 'ec2',
'DbMsrProperties' => {
'IsBackupR
+unning' => '1395658969',
'LastBundl
+eTime' => '0',
'IsBundleR
+unning' => '0',
'LastBacku
+pTime' => '1395475213'
},
'CloudLocation' => 'us-west-1',
'Name' => 'prod-xxx-platform-no
+-sync-db-mysql64-ubuntu1204',
'Category' => 'Databases',
'PlatformProperties' => {
'Instan
+ceType' => 'm3.medium',
'Availa
+bilityZone' => 'us-west-1b'
},
'ScalingAlgorithmSet' => {},
'ScalingProperties' => {
'MaxInst
+ances' => '4',
'MinInst
+ances' => '2'
}
}
]
}
};
print refStructure ($VAR1, 0, ' ', '$VAR1' );