perlで変数の型を調べる

変数がリファレンスである場合に参照先が配列かハッシュか調べる。
blessが絡むとrefだけでもscalarだけでもダメらしい。

sub getDataType($){
	return if not ref $_[0];     # return null if not reference type.
	$_[0]=~/(\w+)\(/; # use scalar to void effect of bless.
	return $1;
}
sub test{
	my($v)=@_;
	my $g = getDataType($v);
	my $r   = ref($v);
	my $s   = scalar($v);
	defined($g) or $g ="(null)";
	defined($r) or $r ="(null)";
	defined($s) or $s ="(null)";
	print "gdt=$g\tref=$r\tscalar=$s\n";
}

my $a;
sub b{}
my $glob;

test( undef );
test(	'' );
test(	0 );
test(	1 );
test(	[] );
test(	{} );
test(	\$a );
test(	\&b );
test(	\*glob );
test(	(bless[],"HOGE") );
test(	(bless{},"HOGE")  );
test(	(bless\$a,"HOGE") );
test(	(bless\&b,"HOGE") );
test(	(bless\*glob,"HOGE") );