use strict; use warnings; sub better_type { my $obj = shift; my $type = ref $obj; my $orgType = $type; my @ref = qw[ SCALAR ARRAY HASH ] ; #CODE REF GLOB LVALUE ]; if( grep { $_ eq $type } @ref ) { bless $obj, '__schwern'; $type = $obj->isa('HASH') ? 'HASH' : $obj->isa('ARRAY') ? 'ARRAY' : $obj->isa('SCALAR') ? 'SCALAR' : undef; bless $obj, $orgType; # bless it back } return $type; } my @objs = ( bless([],'ary'), bless({},'ash'), bless(sub{'blessed sub HASH'},'HASH'), ); printf "%-30s => %s\n\n", $_ => better_type( $_ ) || 'Not HASH, ARRAY or SCALAR' for @objs; __END__ ary=ARRAY(0x1abf0dc) => ary ash=HASH(0x1ab51b0) => ash HASH=CODE(0x1c0b164) => Not HASH, ARRAY or SCALAR