Devrais-je utiliser le conditionnel de Perl? : opérateur comme un commutateur / déclaration de cas ou au lieu de si elsif?

Perl a un conditionnel opérateur qui est le même d'un C est opérateur conditionnel.

À rafraîchir, l'opérateur conditionnel en C et Perl est:

(test) ? (if test was true) : (if test was false)

et si elle est utilisée avec une lvalue vous pouvez attribuer et de tester avec une seule action:

my $x=  $n==0 ? "n is 0" : "n is not 0";

Je lisais Igor Ostrovski blog sur Une belle façon d'exprimer multi-clause si les déclarations en C-les langages et réalisé que ce est en effet une "proprement" en Perl.

Par exemple: (edit: utilisé Jonathan Leffler la forme plus lisible...)

# ternary conditional form of if /elsif construct:
my $s=
      $n == 0     ? "$n ain't squawt"
    : $n == 1     ? "$n is not a lot"
    : $n < 100    ? "$n is more than 1..."
    : $n < 1000   ? "$n is in triple digits"
    :               "Wow! $n is thousands!" ;  #default

Qui lit BEAUCOUP plus facile que ce que l'on pouvait écrire en Perl:
(edit: utilisé cjm est plus élégant my $t=do{ if }; forme dans rafi réponse)

# Perl form, not using Switch or given /when
my $t = do {
    if    ($n == 0)   { "$n ain't squawt"        }
    elsif ($n == 1)   { "$n is not a lot"        }
    elsif ($n < 100)  { "$n is more than 1..."   }
    elsif ($n < 1000) { "$n is in triple digits" }
    else              {  "Wow! $n is thousands!" }
};

Existe-il des pièges ou inconvénient? Pourquoi ne devrais-je pas écrire une longue conditionnelle de la forme de cette manière plutôt que d'utiliser if(something) { this } elsif(something) { that }?

L'opérateur conditionnel a droit de l'associativité et la faible priorité. Donc:

a ? b : c ? d : e ? f : g

est interprété comme:

a ? b : (c ? d : (e ? f : g))

Je suppose que vous pourriez avoir besoin parenthèse si vos tests utilisés l'un des rares opérateur de priorité plus basse que ?:. Vous pouvez également placer des cales sous la forme d'un appareil orthodontique, je pense.

Je ne sais à propos de l'obsolète use Switch ou sur Perl 5.10 de l' given/when constructions, et je ne suis pas à la recherche pour une suggestion pour l'utilisation de ces.

Voici mes questions:

  • Avez-vous vu cette syntaxe utilisée en Perl?** Je n'ai pas, et il n'est pas dans perlop ou perlsyn comme une alternative de passer.
  • Les problèmes de syntaxe ou de "pièges" avec l'aide d'un conditionnel /opérateur ternaire de cette façon?
  • Avis: Est-il plus lisible /compréhensible pour vous? Est-il cohérent avec Idiomatiques Perl?

-------- Edit --

J'ai accepté Jonathan Leffler de réponse parce qu'il m'a indiqué Perl Best Practices. La section pertinente est de 6,17 sur Tabulaire Ternaires. Cela m'a permis d'enquêter sur le recours à d'autres. (Si vous Google Perl Tabulaire Ternaires, vous pouvez voir d'autres commentaires.)

Conway en sont deux exemples:

my $salute;
if ($name eq $EMPTY_STR) {
    $salute = 'Dear Customer';
}
elsif ($name =~ m/\A ((?:Sir|Dame) \s+ \S+)/xms) {
    $salute = "Dear $1";
}

elsif ($name =~ m/([^\n]*), \s+ Ph[.]?D \z/xms) {
    $sa1ute = "Dear Dr $1";
}
else {
    $salute = "Dear $name";
}

VS:

           # Name format...                            # Salutation...
my $salute = $name eq $EMPTY_STR                       ? 'Dear Customer'
           : $name =~ m/ \A((?:Sir|Dame) \s+ \S+) /xms ? "Dear $1"
           : $name =~ m/ (.*), \s+ Ph[.]?D \z     /xms ? "Dear Dr $1"
           :                                             "Dear $name"
           ;

Mes conclusions sont les suivantes:

  • Conway ?: exemple est plus lisible et plus simple pour moi que la if/elsif forme, mais j'ai pu voir comment la forme peut être dur à comprendre.
  • Si vous avez Perl 5.13.1, utilisez my $t=do { given { when } }; comme une mission rafi a fait. je pense que given/when est le meilleur idiome maintenant, à moins que le tableau ternaire format est mieux pour votre cas particulier.
  • Si vous avez Perl 5.10+ utilisation given/when en général au lieu de Switch ou si vous avez besoin d'une sorte de cas type de commutateur.
  • Âgés de Perl, c'est une belle forme pour simple des solutions de rechange ou comme un remplacement pour une instruction case. C'est mieux que d'utiliser Switch je pense.
  • Le droit d'associativité gauche désigne le formulaire est évaluée bas vers le haut. Rappelez-vous que lors de l'utilisation de...

source d'informationauteur dawg