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

в коде ниже, у блоге псевдоним, Я заметил использование двойного восклицательного знака !!. Мне было интересно, что это значит и куда я могу пойти в будущем, чтобы найти объяснения синтаксиса Perl. (Да, я уже искал !! at 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!!

3 ответов


это всего два ! логические операторы not, сидящие рядом друг с другом.

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

вы часто увидите это в Гольф-Кода соревнования, потому что это короче, чем при использовании троичной ? : оператор 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

Не-не.

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


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