#! /usr/bin/env perl use strict; use warnings; # test data my @array = ({fname => 'bob', last_name => 'smith' }, {fname => 'tony', last_name => 'jones', age => 23, kids => [ {first_name => 'cheryl', middle_name => 'karen', age => 23 }, {name => 'jimmy', age => 17 } ] }, {fname => 'janet', last_name => 'marcos', 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 .= "var "; my $out .= "var "; my %giant_hash; foreach my $array (@array) { %giant_hash = (%giant_hash, %$array); } my $s_values = 1; introspect(\%giant_hash); my $nest_level = 0; # recursive function that traverses the data structure sub introspect { my $data = shift; my $type = gtype ($data); if ($type eq 'ARRAY') { $nest_level++; $out .= "is an ARRAY with " . glen(@$data) . " elements:"; my $count = 0; foreach my $elem (@$data) { $out .= "\n" . ("\t" x $nest_level) . "elem $count "; introspect (ref $elem ? $elem : \$elem); $count++; } $nest_level--; } if ($type eq 'HASH') { $nest_level++; $out .= "is a HASH with " . scalar (keys %$data) . " keys"; $out .= "\n" . ("\t" x $nest_level) . "the keys are '" . join ("', '", sort keys %$data) . "'"; my $last_key; foreach my $key (keys %$data) { $last_key = $key; $out .= "\n" . ("\t" x $nest_level) . "key '$key' "; introspect (ref $data->{$key} ? $data->{$key} : \$data->{$key}); } $nest_level--; } # our base case if ($type eq 'SCALAR') { $out .= "is a SCALAR"; if (!$s_values) { $out .= " with a value of '$$data'"; } } } print $out; print "\n"; sub glen { return scalar @_; } sub gtype { ref shift; }