Domanda

Alcuni linguaggi come script awk consentono per le assegnazioni condizionali. Ad esempio, dire si ha un file di elenco nel formato:

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

per es.

Grape 4.99
JuicyFruitGum 0.45
Candles 5.99

E si voleva tutto imposta oltre $ 1 ... si potrebbe utilizzare lo script awk:

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

... che utilizza l'assegnazione condizionale per accorciare la sintassi.

Ma dire che si voleva offrire anche $ 1 off tutti gli elementi più di $ 20 e $ 2 off articoli oltre $ 40. Bene in un linguaggio come C è in genere fare qualcosa di simile:

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;
}

... beh ho scoperto si potrebbe kludge awk o altri linguaggi di scripting in assegnazione composta. per esempio:.

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

Le mie domande sono che
a) è assegnazione composta (come questo) generalmente universalmente compatibile con i linguaggi di scripting che supportano l'assegnazione condizionale?
b) C'è un modo non ripiego per fare assegnamento multi-condizionale in script awk?

Per chiarire: sto parlando esclusivamente sulla stenografia per l'assegnazione (<...> <...>: ;, assegnazione non tradizionali condizionale, che ho già so come fare c-come assegnazione composta per nello script Awk come nota a margine, sul motivo per cui potrei usare stenografia, penso che il merito è ovvio -. che è breve, ma mi piace espressioni regolari, si potrebbe desiderare di scrivere un buon. descrizione di ciò che la sintassi di confusione fa per amor di posteri.

È stato utile?

Soluzione

a)

Bash, ksh e zsh condizionale composto supporto (ternario) operatori (Bash non fa galleggianti, però):

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

sintassi operatore ternario di PHP è simile.

Python è ben diversa:

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

Bash, et al, e Ruby (che supporta anche la forma ?:) sostenere questo stile (che mostra la versione di Bash):

[[ condition ]] && do_if_true || do_if_false

che può essere fatto in una forma composta. Questo può eseguire azioni in aggiunta alle assegnazioni.

b) No, non senza esplicito if / else (o ricorrere ad ancora più kludginess creatività.

Altri suggerimenti

In realtà, C ha l'operatore ? anche, in modo che si possa fare lo stesso (fugly) cosa con C.

Tuttavia, si sono essenzialmente facendo codice di sola scrittura lì. Se tu non mi avessi detto che cosa quella dichiarazione awk ha fatto, sarebbe molto difficile da capire. Perché non basta andare avanti e l'uso if?

ti ringrazio te in 6 mesi quando si scopre la necessità di modificarlo.

(a) penso così

(b) Sì


Si dà il caso, il codice "C" è awk quasi legale. La seguente versione leggermente modificato funziona bene come un programma 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)
}

ho preso il punto e virgola, ma nulla di male succede se li si lascia in ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top