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

一种)

Bash、ksh 和 zsh 支持复合条件(三元)运算符(但 Bash 不做浮点数):

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 回答