perl operators

¿Cuál es la diferencia entre "||" y "or" en Perl?



time in perl (4)

¿Cuál es la diferencia entre los operadores de estilo C && , || , ... y su versión de Perl legible para humanos " and ", " or ", ...?

Parece que el código de internet los usa a ambos:

open (FILE, $file) or die("cannot open $file"); open (FILE, $file) || die("cannot open $file");


De Perl Doc ..

  • O

Este es un operador de lista. En el lado derecho de un operador de lista, tiene una precedencia muy baja, de modo que controla todas las expresiones separadas por comas que se encuentran allí. Los únicos operadores con menor precedencia son los operadores lógicos "y", "o" y "no", que se pueden usar para evaluar llamadas a operadores de lista sin la necesidad de paréntesis adicionales. Lógico o, Definido o Exclusivo o

Binario "o" devuelve la disyunción lógica de las dos expresiones que lo rodean. Es equivalente a || a excepción de la muy baja precedencia. Esto lo hace útil para el flujo de control

print FH $data or die "Can''t write to FH: $!";

Esto significa que produce cortocircuitos: es decir, la expresión correcta se evalúa solo si la expresión izquierda es falsa. Debido a su prioridad, probablemente debería evitar usar esto para la asignación, solo para el flujo de control.

$a = $b or $c; # bug: this is wrong ($a = $b) or $c; # really means this $a = $b || $c; # better written this way

Sin embargo, cuando se trata de una asignación de contexto de lista y estás tratando de usar "||" para el flujo de control, es probable que necesite "o" para que la asignación tenga mayor prioridad.

@info = stat($file) || die; # oops, scalar sense of stat! @info = stat($file) or die; # better, now @info gets its due

Por otra parte, siempre puedes usar paréntesis.

  • ||

Si cualquier operador de listas (print (), etc.) o cualquier operador unario (chdir (), etc.) es seguido por un paréntesis izquierdo como el siguiente token, el operador y los argumentos entre paréntesis se consideran de mayor prioridad, solo como una llamada de función normal. Por ejemplo, porque los operadores unarios con nombre tienen una precedencia mayor que ||:

chdir $foo || die; # (chdir $foo) || die chdir($foo) || die; # (chdir $foo) || die chdir ($foo) || die; # (chdir $foo) || die chdir +($foo) || die; # (chdir $foo) || die


El "&&" y "||" los operadores tienen mayor precedencia que sus contrapartes "y", "o".


La única diferencia es su precedencia.

open FILE, $file or die("cannot open $file"); # this works open FILE, $file || die("cannot open $file"); # this doesn''t work open FILE, ($file || die("cannot open $file")); # why it doesn''t work


! , && , || y ^ tienen alta precedencia de modo que son útiles para construir una expresión; not , and , or , y xor tienen baja precedencia de modo que son útiles para el control de flujo entre lo que son esencialmente expresiones diferentes.