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'} //= {})); }