#!/usr/bin/env perl -l use strict; use warnings; use IO::Handle; my $complex_data_hash_ref = { not_used_1 => '', example => { undefined => undef, empty_string => '', non_empty_string => 'string', empty_array_ref => [], non_empty_array_ref => [ 1, 2, 3 ], empty_hash_ref => {}, non_empty_hash_ref => { x => 24, y => 25, z => 26 }, scalar_ref => \42, glob_ref => \*STDOUT, code_ref => sub { print "\n\t\tHello, world!\n" }, ref_ref => \\99, blessed_ref => IO::Handle::->new(), ref_ref_ref => \\\999, regex => qr{match}, vstring => v65, vstring_ref => \v65, }, not_used_2 => '', }; my @example_keys_to_parse = qw{ undefined empty_string non_empty_string empty_array_ref non_empty_array_ref empty_hash_ref non_empty_hash_ref glob_ref code_ref ref_ref blessed_ref ref_ref_ref regex vstring vstring_ref }; for my $example_key (@example_keys_to_parse) { my $example_key_value = $complex_data_hash_ref->{example}{$example_key}; examine_data($example_key, $example_key_value); } sub examine_data { my ($in_key, $in_value) = @_; print "Examining '$in_key':"; if (ref $in_value) { print "\tThe value of '$in_key' is a reference."; print "\tThe value of '$in_key' is '$in_value'."; my $ref = ref $in_value; print "\tThe ref() value of '$in_key' is '$ref'."; if ($ref eq 'SCALAR') { my $deref = ${$in_value}; print "\tIts dereferenced value is '$deref'."; } elsif ($ref eq 'ARRAY') { my @deref = @{$in_value}; if (@deref) { print "\tIts dereferenced value has these elements: ", "'@deref'."; } else { print "\tIts dereferenced value has no elements."; } } elsif ($ref eq 'HASH') { my %deref = %{$in_value}; my @deref_keys = keys %deref; if (@deref_keys) { print "\tIts dereferenced value has these keys: ", "'@deref_keys'."; my @deref_values = values %deref; print "\tIts dereferenced value has these values: ", "'@deref_values'."; } else { print "\tIts dereferenced value has no key-value pairs."; } } elsif ($ref eq 'GLOB') { print $in_value "\tA globref can be a filehandle opened for writing."; } elsif ($ref eq 'CODE') { $in_value->(); } elsif ($ref eq 'REF') { examine_data('dereferenced__' . $in_key, ${$in_value}); } else { print "\tTODO: Further work on this type ", 'is left as an exercise for the reader.'; } } else { print "\tThe value of '$in_key' is not a reference."; if (defined $in_value) { print "\tThe value of '$in_key' is defined."; if (length $in_value) { print "\tThe value of '$in_key' is '$in_value'."; } else { print "\tThe value of '$in_key' is zero-length."; } } else { print "\tThe value of '$in_key' is not defined."; } } }