2010-01-30 349 views
33

Nel codice sottostante, da un blog post by Alias, ho notato l'uso del punto esclamativo doppio !!. Mi chiedevo cosa significasse e dove potevo andare in futuro a trovare spiegazioni per la sintassi del Perl come questa. (Sì, ho già cercato !! allo perlsyn).Cosa fa !! (doppio punto esclamativo) significa?

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
Grazie per tutte le vostre risposte.

Qui è un'altra cosa ho appena scoperto che non è, non legato The List Squash Operator x!!

+4

Se pensate che '!!' sia un operatore divertente, provate l'operatore '->' in un ciclo for. :) – Ether

+0

Ether, puoi pubblicare un collegamento con l'operatore ->? Non so come trovarlo su google. – Geo

+0

@Geo: ecco qua (riderai, non mi odio): http://stackoverflow.com/questions/1642028/questo-è-il-nome-del-operatore – Ether

risposta

47

Sono solo due ! boolean non operatori seduti uno accanto all'altro.

Il motivo per utilizzare questo idioma è assicurarsi di ricevere uno 1 o un 0. In realtà restituisce una stringa vuota che numifizza a 0. Di solito è usata solo in contesto numerico, o booleano.

Ti capiterà spesso di vedere questo in Code Golf competizioni, perché è più breve di utilizzare il ? : operatore ternario con 1 e 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 
+9

In realtà uso spesso '!!!!' nel mio codice, perché '!!' confonde l'evidenziazione della sintassi di vim e un altro '!!' lo ripristinerà! – Ether

+26

@Ether: * Ovviamente *, è necessario utilizzare emacs. :) –

+10

Produce 1 o il falso valore canonico, non 0. Questo è 0 nel contesto numerico ma la stringa vuota nel contesto di stringa. Per ottenere 0 o 1, usa l'operatore '1-!' :) – ysth

12

.

Converte il valore in un valore booleano (o il più vicino possibile a Perl per una cosa del genere).

+4

È anche un linguaggio comune in altre lingue, come Javascript. – mpeters

+0

@David Dorward Grazie per la tua risposta! –

-1

perché tre altre risposte sostengono che la gamma è "0" o "1", ho solo pensato che avrei detto che booleani in Perl (come restituito da operatori come ==, not, e così via) sono undef e 1, non 0 e 1.

+3

Questo non è corretto. Quando un operatore deve generare un valore falso, utilizza un valore magico che valuta come stringa vuota nel contesto di stringa o 0 nel contesto numerico. (Le eccezioni sono operatori come 'and' e' or', che restituiscono semplicemente l'operando che ha causato il loro ritorno falso.) (Vedi http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood) – cjm

+2

undef è anche un valore magico che valuta come '' nel contesto stringa e 0 nel contesto numerico - l'unica differenza è che quando gli avvertimenti sono abilitati, usare undef per la sua stringa o valore numerico è atto a produrre un avvertimento, mentre 'il valore falso' non fa nulla;) – hobbs

+2

@hobbs: Beh, un'altra differenza è che 'defined (undef)' è false , ma 'defined (1 == 2)' è vero. – cjm