【问题标题】:How can I test that "something" is a hash in Perl?如何测试“某物”是 Perl 中的哈希?
【发布时间】:2010-09-26 03:17:44
【问题描述】:

我正在从另一个函数接收哈希哈希,哈希哈希的某些元素可能是另一个哈希。如何测试某个东西是否是哈希?

【问题讨论】:

标签: perl


【解决方案1】:

根据您的需要,您需要使用refreftype(位于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";
}

【讨论】:

  • @brian d foy 你不熟悉“tf”这个词吗?这就像“如果”,但更是如此。
  • 那么,一个更强的 if 版本?有没有更弱的版本?
  • 我认为 强调 if 是“iiiif”,或者错误地:'i'x$n.'f'(对于 $n > 1)
  • 工作就像一个魅力。谢谢!!
  • 来自perldoc 'ref': 如果被引用的对象已经被祝福到一个包中,那么这个包名就会被返回。但是不要使用它,因为它现在被认为是“不好的做法”。出于一个原因,一个对象可能正在使用一个名为 Regexp 或 IO 的类,甚至是 HASH 。此外, ref 不考虑子类,就像 isa 一样。相反,使用blessed(在Scalar::Util 模块中)进行布尔检查,使用isa 进行特定类检查,使用reftype(也来自Scalar::Util)进行类型检查。
【解决方案2】:

使用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。并不是说你应该这样做。
【解决方案3】:

我一直使用isa,但是如果被测试的东西不是对象(或者可能不是对象),则需要将其调用为函数UNIVERSAL::isa

if ( UNIVERSAL::isa( $var, 'HASH' ) ) { ... }

【讨论】:

    【解决方案4】:
    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

    【讨论】:

    • Params::Util::_HASHLIKE 调用Scalar::Util::reftype,但它也会检查它的参数是否重载了哈希解引用运算符——这会检测到可以伪装成哈希引用的对象,即使它们不是真正的哈希引用.
    • @mobrule:是的,我知道。我只是认为提出两个选择会促使他访问链接以查看差异。我加了一张纸条说他可能不需要它。
    猜你喜欢
    • 2012-08-10
    • 2023-04-07
    • 2012-05-14
    • 2011-04-20
    • 2014-11-26
    • 1970-01-01
    • 2011-05-15
    • 2011-11-22
    相关资源
    最近更新 更多