Что значит!! (двойной восклицательный знак) означает?

В приведенном ниже коде из сообщение в блоге от 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;

    ...
}

UPDATE
Спасибо за все ваши ответы.

Вот что-то еще, что я только что нашел, связанный Оператор склеивания списка x!!

Ответы

Ответ 1

Это всего лишь два ! логических, а не операторов, расположенных рядом друг с другом.

Причиной использования этой идиомы является то, что вы получаете 1 или 0. На самом деле он возвращает пустую строку, которая numifys равна 0. Обычно она используется только в числовом или булевом контексте.

Вы часто увидите это в соревнованиях Code Golf, потому что он короче, чем использование тройного оператора ? : с 1 и 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

Ответ 2

не-нет.

Он преобразует значение в логическое (или близко, как Perl получает к такому веществу).

Ответ 3

Поскольку три других ответа утверждают, что диапазон равен "0" или "1", я просто подумал, что я бы сказал, что логические переменные в Perl (возвращаемые операторами типа ==, not и т.д.) undef и 1, а не 0 и 1.