2009-10-03 6 views
28

Laquelle de ces sous-routines est pas comme l'autre?Quelle est la différence entre Perl (ou, et) et (||, &&) opérateurs de court-circuit?

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; 
} 

Je suis venu à Perl 5 de C et Perl 4 et toujours utilisé || jusqu'à ce que je plus à l'aide de scripts or et j'ai aimé la façon dont il avait l'air. Mais comme le montre le quiz ci-dessus, il n'est pas sans ses pièges pour les imprudents. Pour les personnes qui utilisent à la fois des constructions ou qui utilisent beaucoup de or, quelles sont les règles empiriques utilisez-vous pour décider quelle construction à utiliser et assurez-vous que le code est en train de faire ce que vous pensez qu'il fait?

+7

Je vais prendre les relations Japon-États-Unis pour 200 $, Trebek. – Rap

+0

Copie possible de [Quelle est la différence entre "||" et "ou" dans Perl?] (http://stackoverflow.com/questions/1136583/what-is-the-difference-between-and-or-in-perl) – user

Répondre

39

En raison de la faible priorité de l'opérateur « ou », OR3 parse comme suit:

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

Le conseil habituel est d'utiliser uniquement la 'ou' opérateur pour le flux de contrôle:

@info = stat($file) or die; 

pour une discussion plus approfondie, consultez le manuel perl: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

+0

lien maintenant cassé: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or – flies

+0

@flies: Merci, j'ai mis à jour le lien dans ma réponse! –

+0

'ou' l'opérateur est prioritaire même plus bas que l'opérateur d'affectation, alors méfiez-vous. –

1

Je pense que OR3 est différent.

Je ne suis pas vraiment un gars Perl, mais il semble que 1, 2 et 4 renvoient tous explicitement booléens. Je suppose que 3 a des effets secondaires, comme le retour de $ a ou quelque chose de fou comme ça.

regarde vers le bas

Hey, j'avais raison.

+3

Correct, mais vous ne dites pas pourquoi. – Ether

+1

@Ether: Je ne savais pas pourquoi. : P –

+0

Vous avez gagné le jeu de devinettes! – jrockway

18

Quelles règles empiriques utilisez-vous pour décider quelle construction à utiliser et assurez-vous que le code est en train de faire ce que vous pensez qu'il fait

Les operator precedence règles. Lie étroitement, or se lie faiblement. Il n'y a pas de «règle empirique».

Si vous devez avoir une règle générale, que diriez-vous "utiliser uniquement or lorsqu'il n'y a pas lvalue":

or:

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

||:

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

Je suis d'accord avec MJD pour éviter les parens; si vous ne connaissez pas les règles, cherchez-les ...mais n'écrivez pas (open(my $fh, '>', 'file')) or (die("Failed to open file: $!")) "juste pour être sûr", s'il vous plaît.