好的,所以我遇到了一个看起来像
的代码@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;
这是我第一次看到使用双重否定。有什么用?一个人何时会使用它?
答案 0 :(得分:44)
它将非布尔类型转换为布尔值(dualvar(0,"")
或1
)。
这是一种执行此操作的快捷方式,而不是尝试显式转换它(可能需要更多字符)。 !
运算符否定了其论证的真实性。因此,使用了其中两个。
许多对象类型都是“真实的”,而其他对象类型则是“假的”。
0
,undef
,""
,"0"
和一些重载的对象。1
,"asdf"
和所有其他值。答案 1 :(得分:10)
对于sort
阻止来说,这是一个很大的恐惧!
它基本上是两级排序:
所以可以将其重写为(未经测试):
@documents = sort { exists $deleted_documents_names{$a} # same effect as '!!'
<=>
exists $deleted_documents_names{$b}
||
uc( $a ) cmp uc( $b )
}
@documents;