my $val = $_; use Carp qw(confess); if ( ! defined $val ) { return 'null'; } elsif ( ! ref($val) ) { if ( $val =~ /^-?\d+$/ ) { return 'int'; } elsif ( $val =~ /^-?\d+(\.\d+)?$/ ) { return 'float'; } else { return 'string'; } } else { my $type = ref($val); if ( $type eq 'HASH' || $type eq 'ARRAY' ) { return 'array'; } elsif ( $type eq 'CODE' || $type eq 'REF' || $type eq 'GLOB' || $type eq 'LVALUE' ) { return $type; } else { # Object... return 'obj'; } }