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
ouperlsyn
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 laif/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 quegiven/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 deSwitch
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
Vous devez vous connecter pour publier un commentaire.
La disposition représentée pour l'opérateur conditionnel est difficile à lire.
C'est ce que je me souviens Perl Best Practices recommander:
Et il y a des moments où il est préférable d'utiliser une notation plus compacte avec la
if
notation, trop:Ces deux reformattings souligner la similitude des différentes sections du code, le rendant plus facile à lire et à comprendre.
J'ai vu cet idiome utilisé en perl. Comme l'opérateur ternaire
? :
est, bien.. un opérateur, il est documenté dansperlop
pasperlsyn
.À mes yeux, c'est une sorte de idiomatique Perl, mais le but principal de ce en Perl semble éviter l'absence d'un bon
switch
déclaration, tout n'est pas écrit énormeif/else
-cascades. Toutefois, ce problème a été corrigé il y a des années en perl 5.10.0. Ces jours-ci je ne vois pas beaucoup de raisons de ne pas écrire ci-dessus, qui semble être beaucoup plus lisible que (ab)en utilisant le ternaire:ou, comme de perl 5.13.1, de même que:
Une autre alternative serait quelque chose comme cela, qui fonctionne sur toutes les versions de perl:
Bien que cela évite à la fois à l'aide d'énormes
if/elsif/else
-cascades, et n'a pas besoin des fonctionnalités de dernières perls, ce n'est probablement pas en vaut la peine pour cet exemple simple. Cependant, je peux très bien voir une telle approche utile avec beaucoup de conditions et avec la contrainte de vouloir supporter les anciennes perls.(À noter également que votre exemple ne gère pas les $n étant plus petit que zéro ou de ne pas être un certain nombre à tous.)
Note du cjm: Vous pouvez aussi faire cela dans toutes les versions de Perl 5:
J'ai vu l'enchaînement des conditions tout à fait un peu, parfois, et il détestait toujours. C'est très pratique mais moche, sauf si vous allez à l'extrême pour la formater et de simplifier la interstitielle expressions.
Ils ne sont pas si difficile à comprendre une fois que vous avez exécuté sur un couple de fois et de réaliser que c'est un idiome. Il est plus facile de comprendre une bonne instruction switch. Il y a également moins de risques d'égarer un colon et jouer le tout dans un dur-à-spot.
Et encore une autre façon!
Je touche à ce sujet dans quelques posts que j'ai fait:
/I3az/