2012-03-14 12 views
11

Tengo una declaraciónPerl una línea si la declaración

$set eq "Y" ? $set = "N" : $set = "Y"; 

Pero no importa lo que siempre se pone a "N"

# Toggle setting 
if ($set eq "Y") 
{ 
    $set = "N"; 
} 
else 
{ 
    $set = "Y"; 
} 

¿Por qué no el revestimiento parece funcionar?

+0

@ruakh: Sí, pero no lo cambia de ''Y'' a'' N''. –

+0

@KeithThompson: Sí, tienes razón. El OP dijo que siempre lo establece en '' N'', pero en realidad es exactamente lo contrario. – ruakh

+0

Oh, sí, esto es cierto. Olvidé que cambié las respuestas a su original. –

Respuesta

25

Debido a las reglas de prioridad, Perl no es analizar su estado de cuenta como se piensa :

$ perl -MO=Deparse,-p -e '$set eq "Y" ? $set = "N" : $set = "Y"' 
((($set eq 'Y') ? ($set = 'N') : $set) = 'Y'); 
-e syntax OK 

Así que como ves, en ambas condiciones, el resultado final es el escalar $set que luego se establece en Y.

se puede arreglar con unos parens:

$set eq "Y" ? $set = "N" : ($set = "Y") 

Pero ¿por qué repetir la misión:

$set = $set eq 'Y' ? 'N' : 'Y'; 
+0

Gracias, por la explicación detallada de mi mal Perl. Terminé con un 'mi $ set = ($ set eq 'Y'? 'N': 'Y');' como en la respuesta de @ Keith. –

7
$set = ($set eq "Y") ? "N" : "Y"; 

debería funcionar

8

La precedencia de operadores. Lo que ha escrito es equivalente a

($set eq "Y" ? $set = "N" : $set) = "Y"; 

Si insiste en escribir dicho código conciso, esto tendría más sentido:

$set = ($set eq "Y" ? "N" : "Y"); 
5

Se trata de precedencia; vamos a hacer el intento con paréntesis, y luego dejar que Perl eliminar de nuevo:

perl -MO=Deparse -e '($set eq "Y") ? ($set = "N") : ($set = "Y"); print $set' 
$set eq 'Y' ? $set = 'N' : ($set = 'Y'); 
print $set; 
-e syntax OK 

¿Qué es, pues, el parenthesing necesaria para hacer lo que pretendía.

3

Si prefiere no utilizar sentencias condicionales de estilo "C", se puede hacer lo mismo con 2 líneas:

my $set = "Y"; #Set the scope and default value 
$set = "N" if ($set eq "Y"); 

Yo personalmente recomiendo el estilo "C" descrito por los demás por encima ... es fácil demuestra las dos opciones que una variable puede tener.

Sin embargo, el método que muestro es excelente cuando se trata de un único resultado condicional.

Cuestiones relacionadas