2010-01-30 33 views
33

En el siguiente código, de blog post by Alias, noté el uso del doble signo de exclamación !!. Me preguntaba qué significaba y hacia dónde podría ir en el futuro para encontrar explicaciones para la sintaxis de Perl como esta. (Sí, ya busqué !! en perlsyn).¡Qué hace! (doble signo de exclamación) 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; 

    ... 
} 

ACTUALIZACIÓN
Gracias por todas sus respuestas.

Aquí es otra cosa que acabo de encontrar lo que está relacionado The List Squash Operator x!!

+4

Si piensas '!!' es un operador divertido, prueba el operador '->' en un ciclo for. :) – Ether

+0

Ether, ¿puedes publicar un enlace al operador ->? No sé cómo encontrarlo en google. – Geo

+0

@Geo: aquí tienes (te reirás; no me odies): http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator – Ether

Respuesta

47

Son solo dos ! operadores booleanos que no se encuentran uno al lado del otro.

El motivo para usar este idioma es asegurarse de recibir 1 o 0. En realidad, devuelve una cadena vacía que numifica a 0. Sin embargo, generalmente solo se usa en contexto numérico o booleano.

A menudo verá esto en Code Golf competiciones, ya que es más corto que el uso de la ? : operador ternario con 1 y 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

De hecho, a menudo uso '!!!!' en mi código, porque '!!' confunde el resaltado de sintaxis de vim y otro '!!' lo restaurará. – Ether

+26

@Ether: * Obviamente *, necesita usar emacs. :) –

+10

Produce 1 o el valor falso canónico, no 0. Esto es 0 en contexto numérico pero la cadena vacía en contexto de cadena. Para obtener 0 o 1, use el operador '1-!' :) – ysth

12

no-no.

Convierte el valor a booleano (o tan cerca como Perl llegue a tal cosa).

+4

También es una expresión común en otros idiomas como Javascript. – mpeters

+0

@David Dorward ¡Gracias por tu respuesta! –

-1

porque tres otras respuestas afirman que el rango es "0" o "1", sólo pensé que me gustaría mencionar que booleanos en Perl (como los devueltos por los operadores como ==, not, etc.) son undef y 1, no 0 y 1.

+3

Esto no es correcto. Cuando un operador tiene que generar un valor falso, utiliza un valor mágico que se evalúa como la cadena vacía en contexto de cadena o 0 en contexto numérico. (Las excepciones son operadores como 'y' y' o', que simplemente devuelven el operando que provocó que devuelvan falso.) (Ver http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood) – cjm

+2

undef es también un valor mágico que se evalúa como '' en contexto de cadena y 0 en contexto numérico, la única diferencia es que cuando las advertencias están habilitadas, usar undef para su cadena o valor numérico es apto para producir una advertencia, mientras que 'el valor falso' no lo hace;) – hobbs

+2

@hobbs: Bueno, otra diferencia es que 'defined (undef)' es falso , pero 'defined (1 == 2)' es verdadero. – cjm

Cuestiones relacionadas