使用双重否定(!!)

时间:2012-09-05 10:05:26

标签: perl operators boolean

好的,所以我遇到了一个看起来像

的代码
@documents_names = sort {
         !!$deleted_documents_names{$a} == !!$deleted_documents_names{$b}
          ? uc($a) cmp uc($b)
          : !!$deleted_documents_names{$a}
          cmp !!$deleted_documents_names{$b}
         } @documents_names;

这是我第一次看到使用双重否定。有什么用?一个人何时会使用它?

2 个答案:

答案 0 :(得分:44)

它将非布尔类型转换为布尔值(dualvar(0,"")1)。

这是一种执行此操作的快捷方式,而不是尝试显式转换它(可能需要更多字符)。 !运算符否定了其论证的真实性。因此,使用了其中两个。

许多对象类型都是“真实的”,而其他对象类型则是“假的”。

  • 唯一的错误值是0undef"""0"和一些重载的对象。
  • 真值的示例包括1"asdf"和所有其他值。

答案 1 :(得分:10)

对于sort阻止来说,这是一个很大的恐惧!

它基本上是两级排序:

  1. ASCII-betical
  2. 先删除文件,然后取消删除
  3. 所以可以将其重写为(未经测试):

    @documents = sort {  exists $deleted_documents_names{$a} # same effect as '!!'
                           <=> 
                         exists $deleted_documents_names{$b}
                      ||
                         uc( $a ) cmp uc( $b )
                      }
                 @documents;