2010-01-30 16 views
33

Im folgenden Code, von einem blog post by Alias, bemerkte ich die Verwendung des doppelten Ausrufezeichens !!. Ich habe mich gefragt, was es bedeutet und wohin ich in Zukunft gehen könnte, um Erklärungen für die Perl-Syntax zu finden. (Ja, ich habe bereits nach !! unter perlsyn gesucht).Was macht !! (doppeltes Ausrufezeichen) bedeuten?

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
Vielen Dank für Ihre Antworten.

Hier ist etwas, was ich gerade gefunden, dass zusammenhängt The List Squash Operator x!!

+4

Wenn Sie denken, '' '' ist ein Spaß-Operator, versuchen Sie den '->' Operator in einer for-Schleife. :) – Ether

+0

Ether, können Sie einen Link zu dem Operator ->? Ich weiß nicht, wie man es bei Google findet. – Geo

+0

@Geo: Hier gehst du (du wirst lachen; hasse mich nicht): http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator – Ether

Antwort

47

Es ist nur zwei ! boolean nicht Betreiber nebeneinander sitzen.

Der Grund für die Verwendung dieses Idioms besteht darin, sicherzustellen, dass Sie eine 1 oder eine 0 erhalten. Tatsächlich gibt es eine leere Zeichenkette zurück, die auf 0 steht. Sie wird normalerweise nur im numerischen oder booleschen Kontext verwendet.

Sie werden sehen, dies oft in Code Golf Wettbewerben, weil es den ternären kürzer als die Verwendung von ? : Operator mit 1 und 0 ($test ? 1 : 0) ist.

!! 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 
+9

In meinem Code verwende ich '' '' '' '' '' '' '' '' '' 'verwechselt vim's Syntax-Highlighting und ein' '' '' 'wird es wieder herstellen! – Ether

+26

@Ether: * Offensichtlich *, müssen Sie Emacs verwenden. :) –

+10

Es produziert 1 oder den kanonischen falschen Wert, nicht 0. Dies ist 0 im numerischen Kontext, aber die leere Zeichenfolge im Kontext der Zeichenfolge. Um 0 oder 1 zu erhalten, benutzen Sie den '1-!' Operator :) – ysth

12

nicht-nicht.

Es konvertiert den Wert in einen Boolean (oder so nah wie Perl zu so etwas kommt).

+4

Es ist auch eine gemeinsame Redewendung in anderen Sprachen wie Javascript. – mpeters

+0

@ David Dorward Danke für Ihre Antwort! –

-1

Da drei weitere Antworten behaupten, dass der Bereich „0“ oder „1“, dachte ich, ich würde erwähnen, dass booleans in Perl (wie von den Betreibern wie ==, not zurückgegeben, und so weiter) ist undef und 1, nicht 0 und 1.

+3

Dies ist nicht korrekt. Wenn ein Operator einen falschen Wert generieren muss, verwendet er einen magischen Wert, der als leere Zeichenfolge im Zeichenfolgenkontext oder als 0 im numerischen Kontext ausgewertet wird. (Die Ausnahmen sind Operatoren wie 'and' und' or', die einfach den Operanden zurückgeben, der bewirkt hat, dass sie false zurückgegeben haben.) (Siehe http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood) – cjm

+2

undef ist auch ein magischer Wert, der als '' im String-Kontext und 0 im numerischen Kontext ausgewertet wird - der einzige Unterschied ist der Wenn Warnungen aktiviert sind, kann die Verwendung von undef für die Zeichenfolge oder den numerischen Wert eine Warnung erzeugen, während "der falsche Wert" dies nicht tut;) – hobbs

+2

@hobbs: Nun, ein weiterer Unterschied ist, dass "definiert (undef)" falsch ist , aber 'defined (1 == 2)' ist wahr. – cjm