32

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

@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;

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

4

2 回答 2

44

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

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

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

  • 唯一的错误值是0undef"""0"一些重载对象。
  • 真值的示例是1"asdf"和所有其他值。
于 2012-09-05T10:07:05.763 回答
10

sort对于一个街区来说,这是一个很大的放克!

它本质上是一个两级排序:

  1. 科学的
  2. 先删除文件,再取消删除

因此,可以将其重写为(未经测试):

@documents = sort {  exists $deleted_documents_names{$a} # same effect as '!!'
                       <=> 
                     exists $deleted_documents_names{$b}
                  ||
                     uc( $a ) cmp uc( $b )
                  }
             @documents;
于 2012-09-05T11:14:01.250 回答