使用双重否定(!!)

Cha*_*hak 31 perl boolean operators

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

@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;
Run Code Online (Sandbox Code Playgroud)

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

ron*_*chn 44

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

这是执行此操作的快捷方式,而不是尝试显式转换(可能需要更多字符).该!运营商否定其参数的truthness.因此,使用其中两个.

许多对象类型是"真实的",而其他对象类型是"假的".

  • 唯一的错误值是0,undef,"","0"和一些超载的对象.
  • 真值的例子是1,"asdf"和所有其他值.


Zai*_*aid 10

对于一个sort街区来说,这很有趣!

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

  1. ASCII-betical
  2. 首先删除文件,然后取消删除

所以可以将其重写为(未经测试):

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