【发布时间】:2010-09-26 03:17:44
【问题描述】:
我正在从另一个函数接收哈希哈希,哈希哈希的某些元素可能是另一个哈希。如何测试某个东西是否是哈希?
【问题讨论】:
标签: perl
我正在从另一个函数接收哈希哈希,哈希哈希的某些元素可能是另一个哈希。如何测试某个东西是否是哈希?
【问题讨论】:
标签: perl
根据您的需要,您需要使用ref 或reftype(位于Scalar::Util,一个核心模块中)。如果引用是对象,ref 将返回对象的类而不是底层引用类型,reftype 将始终返回底层引用类型。
if (ref $var eq ref {}) {
print "$var is a hash\n";
}
use Scalar::Util qw/reftype/;
if (reftype $var eq reftype {}) {
print "$var is a hash\n";
}
【讨论】:
'i'x$n.'f'(对于 $n > 1)
使用ref函数:
ref($hash_ref) eq 'HASH' ## $hash_ref is reference to hash
ref($array_ref) eq 'ARRAY' ## $array_ref is reference to array
ref( $hash{$key} ) eq 'HASH' ## there is reference to hash in $hash{$key}
【讨论】:
$r={};bless $r,"fail";print ref $r
$array = []; bless $array, 'HASH'; print ref $array; 打印 HASH。并不是说你应该这样做。
我一直使用isa,但是如果被测试的东西不是对象(或者可能不是对象),则需要将其调用为函数UNIVERSAL::isa:
if ( UNIVERSAL::isa( $var, 'HASH' ) ) { ... }
【讨论】:
use Params::Util qw<_HASH _HASH0 _HASHLIKE>;
# for an unblessed hash with data
print "$ref is a hash\n" if _HASH( $ref );
# for an unblessed hash empty or not
print "$ref is a hash\n" if _HASH0( $ref );
# for a blessed hash OR some object that responds as a hash*
print "$ref is hashlike\n" if _HASHLIKE( $ref );
* 通过overload
不过,您可能不需要最后一个。
【讨论】:
Params::Util::_HASHLIKE 调用Scalar::Util::reftype,但它也会检查它的参数是否重载了哈希解引用运算符——这会检测到可以伪装成哈希引用的对象,即使它们不是真正的哈希引用.