perl – exists和defined有什么区别?

前端之家收集整理的这篇文章主要介绍了perl – exists和defined有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有什么区别
  1. if (defined $hash{$key}) { }@H_403_3@
  2. if (exists $hash{$key}) { }@H_403_3@ 
  3.  

    我什么时候知道使用哪个?

解决方法

这在 definedexists的perldoc条目中有详细记录。下面是一个快速摘要

defined $ hash {key}告诉你是否定义给定键的值(即不是undef)。使用它来区分未定义的值和在布尔上下文中为false的值,例如0和”。

exists $ hash {key}告诉你%hash是否包含给定的键。使用它来区分未定义的值和不存在的值。

这是最容易看到一个例子。给定这个散列:

  1. my %hash = (a => 1,b => 0,c => undef);@H_403_3@
  2. 这里是检索,定义和存在的结果:

  3. # key  value  defined  exists
  4. a          1        1       1
  5. b          0        1       1
  6. c      undef        0       1
  7. d      undef        0       0@H_403_3@ 
  8.  

    在实践中,人们经常只写if($ hash {key}){…},因为(在很多通常情况下)只有真值有意义/可能。如果false值有效,那么必须在测试中添加defined()。 exists()的使用频率更低。最常见的情况是可能在使用哈希作为集合。例如

  9.   
  10.  
    my %set = map { $_ => undef } 'a' .. 'z';@H_403_3@ 
  11.  

    使用undef设置值有几个好处:

  12.  

    >它更准确地表示意图(只有键是有意义的,而不是值)。
    >所有undef值共享单个分配(这会节省内存)。
    > exists()测试稍快(因为Perl不必检索值,只确定有一个)。

  13.  

    它也有缺点,你必须使用exists()来检查集合成员身份,这需要更多的输入,如果你忘记它会做错的事情。

  14.  

    另一个存在的地方是有用的是在尝试检索值之前探测锁定的哈希值(这将触发异常)。

猜你在找的Perl相关文章