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()?)