38

在下面的代码中,来自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;

    ...
}

更新
感谢您的所有回答。

这是我刚刚发现的与列表壁球运算符相关的其他内容x!!

4

3 回答 3

53

它只是两个!相邻的布尔非运算符。

使用此成语的原因是确保您收到 a1或 a 0。实际上它返回一个空字符串,它 numifys 为 0。它通常只用于数字或布尔上下文。

您经常会在Code Golf比赛中看到这一点,因为它比使用? :带有1and 0 ( $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
于 2010-01-30T16:17:35.133 回答
12

不是这样的。

它将值转换为布尔值(或与 Perl 接近的那样)。

于 2010-01-30T15:48:22.193 回答
0

因为其他三个答案声称范围是“0”或“1”,所以我只是想提一下 Perl 中的布尔值(由 , 等运算符返回==notundefand 1,而不是0and 1

于 2010-01-31T05:20:32.260 回答