Update I fixed my original proposal with a comma kluge (so that it wouldn't die when the input was a ref to an empty hash. The resulting line is so long and tortured that it hardly qualifies as a one-liner, and it is not particularly clear coding, so I don't think it is worth the trouble. FWIW, here it is (along with some minimal testing code):
use strict; use warnings; use Scalar::Util 'reftype'; use Test::More 'no_plan'; sub foo { reftype( $_[ 0 ] ) || '' eq 'HASH' and ( my %h = %{ shift() } ), 1 o +r 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__
Update #2771: Changed the code to use Scalar::Util::reftype instead of UNIVERSAL::isa, in response to chromatic's comment. If the code was tortured before, it is even more so now. The business with || '' is to silence a warning.
the lowliest monk
In reply to Re: Better way to dereference a shifted hashref arg?
by tlm
in thread Better way to dereference a shifted hashref arg?
by tphyahoo
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |