web-dev-qa-db-fra.com

Quelle est la différence entre "||" et "ou" en Perl?

Quelle est la différence entre les opérateurs de style C &&, ||, ... et leur version Perl lisible par l'homme "and", "or", ...?

Il semble que code Internet les utilise tous les deux:

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

De Perl Doc ..

  • OU

Il s'agit de l'opérateur de liste. Sur le côté droit d'un opérateur de liste, il a une priorité très faible, de sorte qu'il contrôle toutes les expressions séparées par des virgules qui s'y trouvent. Les seuls opérateurs ayant une priorité inférieure sont les opérateurs logiques "et", "ou" et "non", qui peuvent être utilisés pour évaluer les appels aux opérateurs de liste sans avoir besoin de parenthèses supplémentaires. Logique ou, Défini ou, et Exclusif Ou

Binaire "ou" renvoie la disjonction logique des deux expressions environnantes. C'est équivalent à || à l'exception de la très faible priorité. Cela le rend utile pour contrôler le flux

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

Cela signifie qu'il court-circuite: c'est-à-dire que l'expression de droite n'est évaluée que si l'expression de gauche est fausse. En raison de sa priorité, vous devriez probablement éviter de l'utiliser pour l'affectation, uniquement pour le flux de contrôle.

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

Cependant, lorsqu'il s'agit d'une affectation de contexte de liste et que vous essayez d'utiliser "||" pour le flux de contrôle, vous avez probablement besoin de "ou" pour que l'affectation soit prioritaire.

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

Là encore, vous pouvez toujours utiliser des parenthèses.

Si un opérateur de liste (print (), etc.) ou un opérateur unaire (chdir (), etc.) est suivi d'une parenthèse gauche comme prochain jeton, l'opérateur et les arguments entre parenthèses sont considérés comme ayant la priorité la plus élevée, juste comme un appel de fonction normal. Par exemple, parce que les opérateurs unaires nommés ont une priorité plus élevée 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
40
joe

La seule différence est leur priorité.

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
36
dave4420

!, &&, ||, et ^ ont une priorité élevée de sorte qu'ils sont utiles dans la construction d'une expression; not, and, or et xor ont une faible priorité de sorte qu'ils sont utiles pour le contrôle de flux entre des expressions essentiellement différentes.

34
ysth

Les "&&" et "||" les opérateurs ont une priorité plus élevée que leurs homologues "et", "ou".

11
Inshallah