my $out .= "var ";
my $out .= "var ";
####
(Shapes =>
[
{ Type => 'Circle', Diameter => 2, Center => [0,1] },
{ Type => 'Square', Side => 3, Pos => [4,8] },
[ {x => 1, y => 1}, {x => 3, y => 1}, {x => 4, y => 2}, {x => 2, y => 2} ]
]
);
####
var is a HASH with 5 keys
the keys are 'age', 'fname', 'kids', 'last_name', 'occupation'
key 'kids' is an ARRAY containing HASHREFs:
the keys are 'age', 'name', 'vaccinated'
key 'vaccinated' is a SCALAR
key 'age' is a SCALAR
key 'name' is a SCALAR
key 'fname' is a SCALAR
key 'age' is a SCALAR
key 'occupation' is a HASH with 2 keys
the keys are 'title', 'years_on_job'
key 'title' is a SCALAR
key 'years_on_job' is a SCALAR
key 'last_name' is a SCALAR
####
use v5.14;
use strict;
use warnings;
use Data::Dump qw( pp );
use YAML;
sub introspect
{
my ($data, $output) = @_;
if (ref $data eq 'ARRAY')
{
my $sub_out = ($output->{'ARRAY'} //= {});
introspect($_, $sub_out) for @{ $data };
}
elsif (ref $data eq 'HASH')
{
my $hash_out = $output->{"HASH"} //= {};
for my $key (keys %$data)
{
my $sub_out = ($hash_out->{"$key"} //= {});
introspect($_, $sub_out) for $data->{$key};
}
}
elsif (ref $data)
{
$output->{ref($data).'REF'}=1;
}
else
{
$output->{SCALAR}=1;
}
}
my @array = ({fname => 'bob', last_name => 'smith', foo => [\*main]},
{fname => 'tony', last_name => 'jones', age => 23,
kids =>
[
{first_name => 'cheryl',
middle_name => 'karen',
age => 24 },
{name => 'jimmy',
age => 17 }
],
},
{fname => 'janet', last_name => 'marcos', foo => {},
occupation => {
title => 'trucker',
years_on_job => 12} },
{fname => 'Marge', last_name => 'Keefe',
kids =>
[
{name => 'kate', age => 7, vaccinated => 'yes'},
{name => 'kim', age => 5}
]
});
my %out;
introspect(\@array, \%out);
say pp \%out;
say YAML::Dump(\%out);
####
{
ARRAY => {
HASH => {
age => { SCALAR => 1 },
fname => { SCALAR => 1 },
foo => { ARRAY => { GLOBREF => 1 }, HASH => {} },
kids => {
ARRAY => {
HASH => {
age => { SCALAR => 1 },
first_name => { SCALAR => 1 },
middle_name => { SCALAR => 1 },
name => { SCALAR => 1 },
vaccinated => { SCALAR => 1 },
},
},
},
last_name => { SCALAR => 1 },
occupation => {
HASH => { title => { SCALAR => 1 }, years_on_job => { SCALAR => 1 } },
},
},
},
}
---
ARRAY:
HASH:
age:
SCALAR: 1
fname:
SCALAR: 1
foo:
ARRAY:
GLOBREF: 1
HASH: {}
kids:
ARRAY:
HASH:
age:
SCALAR: 1
first_name:
SCALAR: 1
middle_name:
SCALAR: 1
name:
SCALAR: 1
vaccinated:
SCALAR: 1
last_name:
SCALAR: 1
occupation:
HASH:
title:
SCALAR: 1
years_on_job:
SCALAR: 1
####
elsif (ref $data eq 'REF')
{
introspect($$data, ($output->{'REF'} //= {}));
}