4

awk スクリプトなどの特定の言語では、条件付きの割り当てが可能です。たとえば、次の形式のリスト ファイルがあるとします。

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

例えば

Grape 4.99
JuicyFruitGum 0.45
Candles 5.99

そして、1 ドルを超えるものすべてに課税したい場合は、awk スクリプトを使用できます。

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

...条件付き代入を使用して構文を短縮します。

しかし、$20 を超えるすべてのアイテムに $1 オフ、$40 を超えるアイテムに $2 オフも提供したいとします。c のような言語では、通常、次のようにします。

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

...まあ、awk やその他のスクリプト言語を COMPOUND 割り当てに入れることができることを発見しました。例えば:

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

私の質問は、

a)複合代入 (このようなもの) は、条件付き代入をサポートするスクリプト言語と一般的に互換性がありますか?
b) awk スクリプトで複数条件付きの割り当てを実行するための非クラッジ方法はありますか?

明確にするために: 私は代入(<...>?<...>:<...>;の省略形についてのみ話している。従来の条件付き代入ではなく、cのような複合代入を行う方法をすでに知っている) Awk スクリプトで. 補足として, なぜ私が省略形を使用するのかについて, メリットは明らかだと思います.短いということ. しかし, 正規表現のように, 混乱した構文が後世のために何をするかについての良い説明を書きたいと思うかもしれません. .

4

3 に答える 3

2

a)

Bash、ksh、および zsh は、複合条件 (三項) 演算子をサポートしています (ただし、Bash は float を実行しません)。

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

PHP の三項演算子の構文も同様です。

Python のものはかなり異なります。

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

Bash など、および Ruby (?:フォームもサポート) は、このスタイルをサポートしています (Bash のバージョンを示しています)。

[[ condition ]] && do_if_true || do_if_false

これは複合的な形で行うことができます。これにより、割り当てに加えてアクションを実行できます。

b)いいえ、明示的でないわけではありませんif/ else(または、さらに無頓着な創造性に訴えます.

于 2010-09-15T01:27:01.400 に答える
0

実際、C にも?演算子があるので、C でも同じ (醜い) ことができます。

ただし、基本的にそこで書き込み専用コードを作成しています。その awk ステートメントが何をしたかを教えてくれなかったら、それを理解するのは非常に困難だったでしょう。先に進んで使用してみませんifか?

それを微調整する必要性を発見したとき、あなたは6ヶ月であなた自身に感謝するでしょう.

于 2010-09-14T20:02:28.793 に答える
0

(a) そう思う

(b) はい


たまたま、あなたの「C」コードはほとんど合法的な awk です。次のわずかに調整されたバージョンは、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)
}

セミコロンを削除しましたが、そのままにしても問題はありません...

于 2010-09-14T20:05:42.870 に答える