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

!隣同士に座っている演算子ではなく、2 つのブール値です。

このイディオムを使用する理由は、確実に a1または aを受け取るため0です。実際には、0 に numify される空の文字列を返します。ただし、通常は数値またはブール値のコンテキストでのみ使用されます。

and ( )で三項演算子を使用するよりも短いため、これは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
于 2010-01-30T16:17:35.133 に答える
12

ない-ない。

値をブール値に変換します (または Perl がそのようなものに到達するのと同じくらい近い)。

于 2010-01-30T15:48:22.193 に答える
0

==他の 3 つの回答では、範囲が「0」または「1」であると主張されているため、Perl のブール値 ( 、 などの演算子によって返されるnot) はundefand1ではなく0、 andであることに言及したいと思いました1

于 2010-01-31T05:20:32.260 に答える