6
votes

Que se passe-t-il lorsque vous avez un opérateur conditionnel et un postfix conditionnel dans la même déclaration de PERL?

Quelqu'un peut-il expliquer comment cette ligne fonctionne? xxx pré>

si $ y Il renvoie -PIP2 code>, mais ce qu'il revient Lorsque $ y> = 0 code> et $ x! = 0 code>? p>

Cette ligne est à partir de cette fonction: p>

sub _atan {
    my( $y, $x ) = @_;

    return $y < 0 ? - pip2 : pip2 if $x == 0;
    return atan( $y / $x );
}


0 commentaires

4 Réponses :


7
votes

c'est le même que xxx

la fonction complète devient alors: xxx


0 commentaires

20
votes

Le postfix "si" désigne que l'instruction de retour n'est exécuté que si la condition est vraie, donc xxx

est identique à xxx < p> Si vous êtes perplexe par l'opérateur ternaire?


4 commentaires

Je l'écrirais probablement en utilisant sauf si ($ x) {...


C'est l'opérateur conditionnel, pas l'opérateur ternaire. :)


Je viens d'impliquer que c'était un opérateur ternaire , pas l'opérateur ternaire :)


@Brad Gilbert Soyez prudent sauf si ($ x) et si ($ x == 0) avoir des significations différentes. sauf si ($ x) exécutera lorsque x x est undef , 0 , 0.0 , "" et "0" . si ($ x == 0) exécutera lorsque $ x est IS 0 , 0.0 et toute chaîne qui ne passe pas look_like_number ou évalue à 0 (tel que "0e0" ).



6
votes

Ceci est un bon exemple de Code difficile à lire.

comparons quelques façons différentes de réécrire l'échantillon de code et de voir comment nous faisons dans la brièveté de la brièveté et d'améliorer la lisibilité. P>

Ce ternaire seulement La version gagne pour la brièveté, mais il est toujours difficile de lire: P>

sub _atan {
    my( $y, $x ) = @_;

    return atan( $y / $x )
        unless $x == 0;

    return $y < 0  ? -pip2 : pip2;  
}


0 commentaires

2
votes

Trop de lignes utilisées pour résoudre un problème rend le code difficile à maintenir (toujours obligé de faire défiler). La solution avec imbriquée si elle est 4 fois plus longue. Imaginez travailler avec un écran 4 fois plus petit. Ma syntaxe préférée est la suivante:

sub _atan {
    my ($y, $x) = @_;
    return atan ($y / $x) if $x != 0;
    return $y < 0  ? -pip2 : pip2;
}


1 commentaires

L'avantage d'un opérateur postfix est le même que vous le mettez. Si votre écran ne peut pas voir 24 lignes de code, vous avez d'autres problèmes. :)