use strict; use warnings; use Scalar::Util 'reftype'; use Test::More 'no_plan'; sub foo { reftype( $_[ 0 ] ) || '' eq 'HASH' and ( my %h = %{ shift() } ), 1 or die; return 1; } ok( eval { foo(+{}) }, 'empty hashref' ); ok( !eval { foo() }, 'no input' ); ok( !eval { foo( 1 ) }, 'bad input: constant' ); ok( !eval { foo( [] ) }, 'bad input: array ref' ); ok( eval { foo( +{ 1 => 1 }) }, 'good input' ); __END__ #### UNIVERSAL::isa( $_[0], 'HASH' ) and ( my %hr = %{ shift() } or die; #### UNIVERSAL::isa( $_[0], 'HASH' ) and my $hr = shift or die; #### UNIVERSAL::isa( $_[0], 'HASH' ) and defined( my %h = %{ shift() } ) or die; #... defined(@array) is deprecated at -e line 1. (Maybe you should just omit the defined()?)