Question

Certaines langues comme script awk permettent des affectations conditionnelles. Par exemple, disons que vous avez un fichier de liste dans le format suivant:

<item name, no spaces> <price as float>

par exemple.

Grape 4.99
JuicyFruitGum 0.45
Candles 5.99

Et vous vouliez tout impôt sur plus de 1 $ ... vous pouvez utiliser le script awk:

awk '{a=($2>1.00)?$2*1.06:$2; print a}' prices.data

... qui utilise l'affectation conditionnelle pour raccourcir la syntaxe.

Mais dites que vous vouliez offrir également 1 $ de rabais sur tous les articles de plus de 20 $ et 2 $ de rabais sur des items plus que 40 $. Eh bien dans une langue comme c vous généralement faire quelque chose comme:

if (price > 40.00) {
   price-=2; 
   price *= 1.06; 
}
else if ( price > 20.00 && price <= 40.00 ) {
   price--; 
   price *= 1.06; 
}
else if ( price > 1.00 ) {
   price*=1.06;
}

... et je découvre que vous pourriez kludge awk ou d'autres langages de script en affectation composée. par exemple:.

awk '{a=($2>1.00)?($2>20.00)?($2-1)*1.06:($2>40.00)?($2-2)*1.06:$2*1.06:$2; print a}' prices.data

Mes questions sont que
a) est l'affectation composé (comme celui-ci) de façon générale universellement compatible avec les langages de script qui prennent en charge la cession conditionnelle?
b) Est-il un moyen non-bidouille à faire cession multi-conditionnel dans le script awk?

Pour clarifier: Je parle exclusivement de la sténographie pour l'attribution (<...> <...>: <...> ;, pas l'attribution conditionnelle traditionnelle, je l'ai déjà sais comment comme une note côté do c comme affectation composé pour dans le script awk, la raison pour laquelle je pourrais utiliser un raccourci, je pense que le mérite est évident -. qu'il est courte mais comme regexes, vous voudrez peut-être écrire un bon. description de ce que votre syntaxe confusion fait pour l'amour de la postérité.

Était-ce utile?

La solution

a)

Bash, les opérateurs ksh et zsh conditionnel composé de support (ternaire) (Bash ne fait pas flotteurs, cependant):

for i in {3..5}; do for j in {2..6}; do for k in {2..4}; do
    (( a = i > j ? i > k ? j > k ? i * j : i * k : j * k : 0 ))
    echo $a
done; done; done

ternaire syntaxe de l'opérateur de PHP est similaire.

Python est tout à fait différent:

a = b if c else d if e else f if g else h

Bash, et al, et Ruby (qui soutient aussi la forme de ?:) soutiennent ce style (montrant la version de Bash):

[[ condition ]] && do_if_true || do_if_false

qui peut être fait sous forme de composé. Cela peut effectuer des actions en plus de missions.

b) non, non sans if / else explicite (ou le recours à encore plus kludginess créativité.

Autres conseils

En fait, C a l'opérateur ? aussi, pour que vous puissiez faire la même chose (fugly) avec C.

Cependant, vous êtes essentiellement fait il y a un code d'écriture seule. Si vous ne me aviez pas dit ce que cette déclaration awk fait, il serait très difficile de le comprendre. Pourquoi ne pas simplement aller de l'avant et à l'utilisation if?

Vous allez quand vous découvrez un besoin de ruser vous remercier en 6 mois.

(a) Je pense que si

(b) Oui


Comme il arrive, votre code "C" est presque awk juridique. La version suivante légèrement retouché fonctionne très bien comme un programme awk ...

/./ {
  price = $1
  if (price > 40.00) {
     price -= 2 
     price *= 1.06 
  } else if ( price > 20.00 && price <= 40.00 ) {
     price-- 
     price *= 1.06 
  } else if ( price > 1.00 ) {
     price *= 1.06
  }
  printf("%6.2f\n", price)
}

Je pris les points-virgules, mais rien ne se passe mal si vous les laissez dans ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top