Perl a un opérateur conditional qui est le même un C's conditional operator.Devrais-je utiliser le conditionnel de Perl? : opérateur comme un commutateur/déclaration de cas ou au lieu de si elsif?
Pour rafraîchir, l'opérateur conditionnel en C et en Perl est:
(test) ? (if test was true) : (if test was false)
et si elle est utilisée avec un lvalue vous pouvez assigner et test avec une seule action:
my $x= $n==0 ? "n is 0" : "n is not 0";
Je lisais Igor Le blog d'Ostrovsky sur A neat way to express multi-clause if statements in C-based languages et a réalisé que c'est en effet une «manière ordonnée» dans Perl.
Par exemple: (edit: utilisé sous forme plus lisible Jonathan Leffler ...)
# 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 beaucoup écrire en Perl: (edit: utilisé plus élégant de CJM my $t=do{ if };
forme dans la réponse de rafi)
# 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!" }
};
Y a-t-il des inconvénients ou des inconvénients ici? Pourquoi ne pas écrire une forme conditionnelle étendue de cette manière plutôt que d'utiliser if(something) { this } elsif(something) { that }
? L'opérateur conditionnel a . Alors:
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 entre parenthèses si vos tests utilisés l'un des rares opérateurs de priorité inférieure à ?:
. Vous pouvez également mettre des blocs dans le formulaire avec des accolades je pense.
Je connais le use Switch
déprécié ou sur les constructions given/when
de Perl 5.10, et je ne cherche pas une suggestion pour les utiliser.
Ce sont mes questions:
Avez-vous vu cette syntaxe utilisée en Perl ** Je n'ai pas, et il est pas
perlop
ouperlsyn
comme alternative à changer.Existe-t-il des problèmes de syntaxe potentiels ou des «pièges» avec l'utilisation d'un opérateur conditionnel/ternaire de cette manière? Opinion: Est-il plus lisible/compréhensible pour vous? Est-ce compatible avec Idiomatic Perl?
-------- Edition -
j'ai accepté la réponse de Jonathan Leffler parce qu'il m'a pointé Perl Best Practices. La section pertinente est 6.17 sur Ternaires tabulaires. Cela m'a permis d'étudier l'utilisation plus loin. (Si vous utilisez Google Perl Ternaries, vous pouvez voir d'autres commentaires.)
deux exemples de Conway sont:
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:
exemple Conway
?:
est plus lisible et plus simple pour moi que leif/elsif
forme, mais je pouvais voir comment la forme pourrait être difficile à comprendre.Si vous avez Perl 5.13.1, utilisez
my $t=do { given { when } };
comme une mission comme rafi has done. Je pense quegiven/when
est le meilleur idiome maintenant, à moins que le format ternaire tableau est mieux pour votre cas particulier.Si vous avez Perl 5.10+, utilisez
given/when
en général au lieu deSwitch
ou si vous avez besoin d'une sorte de commutateur de type boîtier.Plus ancien Perl, c'est une bonne forme pour simple alternatives ou comme une alternative à une déclaration de cas. C'est mieux que d'utiliser
Switch
je pense.L'associativité de droite à gauche signifie que la forme est évaluée de bas en haut. Rappelez-vous que lorsque vous utilisez ...
J'aime mieux votre mise en forme pour les deux alternatives, et le formulaire conditionnel que vous avez toujours me lit plus facilement que le if/elsif. Qu'est-ce que tu penses? – dawg
@drewk: ils sont tous deux assez lisibles; le formulaire d'opérateur conditionnel a une seule affectation, donc il est clair qu'une seule valeur est assignée, alors qu'avec la version if-chain l'une des actions pourrait être ''$ l =" quelque chose ";'' et la faute de frappe dans le nom de la variable pourrait aller sans taches pendant un certain temps. Donc, oui, je pense qu'il y a des avantages pour l'opérateur conditionnel - mais ce n'est pas une préférence terriblement forte. –