什么!! (双感叹号)是什么意思?

Chr*_*oms 34 perl boolean operators negation

在下面的代码中,从Alias博客文章中,我注意到使用双感叹号!!.我想知道这意味着什么以及我将来可以在哪里找到像这样的Perl语法的解释.(是的,我已经!!perlsyn搜索了).

package Foo;

use vars qw{$DEBUG};
BEGIN {
    $DEBUG = 0 unless defined $DEBUG;
}
use constant DEBUG => !! $DEBUG;

sub foo {
    debug('In sub foo') if DEBUG;

    ...
}
Run Code Online (Sandbox Code Playgroud)

更新
感谢您的所有答案.

以下是我刚发现的与List Squash Operator相关其他内容x!!

Bra*_*ert 48

它只是两个!布尔运算符而不是彼此相邻的运算符.

使用这个成语的原因是为了确保你收到一个1或一个0.实际上它返回一个空字符串,其数字为0.它通常只用于数字或布尔上下文.

您经常会在Code Golf比赛中看到这一点,因为它比使用和()使用三元? :运算符更短.10 $test ? 1 : 0

!! undef  == 0
!! 0      == 0
!! 1      == 1
!! $obj   == 1
!! 100    == 1

undef ? 1 : 0  == 0
0     ? 1 : 0  == 0
1     ? 1 : 0  == 1
$obj  ? 1 : 0  == 1
100   ? 1 : 0  == 1
Run Code Online (Sandbox Code Playgroud)

  • @Ether:*显然*,你需要使用emacs.:) (29认同)
  • 我实际上经常在我的代码中使用`!!!!`,因为`!!`混淆了vim的语法高亮,而另一个`!!`会恢复它! (11认同)
  • 它产生1或规范的假值,而不是0.这在数字上下文中是0但在字符串上下文中是空字符串.要获得0或1,请使用`1-!`运算符:) (10认同)
  • 作为编写相同代码的人,它就在那里,因为我希望在编译时将该变量归一化.它只是一种质量保护机制. (3认同)
  • @Brad:-1让你注意ysth的评论,将在修复后撤销. (2认同)

Que*_*tin 12

不是这样的.

它将值转换为布尔值(或者像Perl一样接近这样的事物).

  • 它也是其他语言中常见的习惯用法,就像Javascript一样. (4认同)