2009-10-03 16 views
28

¿Cuál de estas subrutinas no es como la otra?¿Cuál es la diferencia entre los operadores de cortocircuito de Perl (o, y) y (||, &&)?

sub or1 { 
    my ($a,$b) = @_; 
    return $a || $b; 
} 

sub or2 { 
    my ($a,$b) = @_; 
    $a || $b; 
} 

sub or3 { 
    my ($a,$b) = @_; 
    return $a or $b; 
} 

sub or4 { 
    my ($a,$b) = @_; 
    $a or $b; 
} 

vine a Perl 5 de C y Perl 4 y siempre usa || hasta que vi más secuencias de comandos utilizando or y me gustaba cómo se veía. Pero como muestra el cuestionario anterior, no es sin sus peligros para los incautos. Para las personas que usan ambos constructos o que usan una gran cantidad de or, ¿qué reglas básicas usas para decidir qué constructo utilizar y para asegurarte de que el código está haciendo lo que crees que está haciendo?

+7

Tomaré las relaciones Japón-Estados Unidos por $ 200, Trebek. – Rap

+0

Posible duplicado de [¿Cuál es la diferencia entre "||" y "o" en Perl?] (http://stackoverflow.com/questions/1136583/what-is-the-difference-between-and-or-in-perl) – user

Respuesta

39

Debido a la baja precedencia del operador 'o', or3 analiza de la siguiente manera:

sub or3 { 
    my ($a,$b) = @_; 
    (return $a) or $b; 
} 

El consejo habitual es utilizar sólo el 'o' operador para el flujo de control:

@info = stat($file) or die; 

para más discusión, véase el manual de Perl: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

+0

link now broken: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or – flies

+0

@flies: ¡Gracias, actualicé el enlace en mi respuesta! –

+0

'o' el operador tiene prioridad incluso menor que el operador de asignación, así que ten cuidado. –

1

Supongo que or3 es diferente.

No soy realmente un tipo Perl, pero parece que 1, 2 y 4 devuelven booleanos explícitamente. Supongo que 3 tiene efectos secundarios, como devolver $ a o algo así de loco.

mira hacia abajo

Hey, yo tenía razón.

+3

Correcto, pero no dice por qué. – Ether

+1

@Ether: No sabía por qué. : P –

+0

¡Has ganado el juego de adivinar! – jrockway

18

Qué reglas de oro que utiliza para decidir qué constructo de usar y asegúrese de que el código está haciendo lo que creo que está haciendo

Los operator precedence reglas.

|| se une fuertemente, or se une débilmente. No hay una "regla de oro".

Si usted debe tener una regla de oro, ¿qué hay de "sólo el uso or cuando no hay valor-I":

or:

open my $fh, '>', 'file' or die "Failed to open file: $!" 

||:

my $greeting = greet() || $fallback || 'OH HAI'; 

Estoy de acuerdo con MJD sobre evitar parientes; si no conoce las reglas, búsquelas ...pero no escriba (open(my $fh, '>', 'file')) or (die("Failed to open file: $!")) "solo para estar seguro", por favor.

Cuestiones relacionadas