某些语言(如awk脚本)允许条件分配。例如,假设您有一个格式为的列表文件:
<item name, no spaces> <price as float>
e.g。
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赋值中。 e.g:
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脚本中是否有非kludge方式进行多条件赋值?
澄清:我只是谈论作业的简写(&lt; ...&gt;?&lt; ...&gt;:&lt; ...&gt ;;,而非传统条件赋值,我已经知道如何在Awk脚本中进行类似c的复合赋值。作为旁注,至于为什么我可以使用速记,我认为优点是显而易见的 - 它很短。但就像正则表达式一样,你可能想要写一个很好的描述你的混乱语法为后人的缘故。
答案 0 :(得分:2)
<强> A)强>
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
(或诉诸更多 kludginess 创造力。
答案 1 :(得分:0)
实际上,C也有?
运算符,所以你可以用C做同样的事情。(/ p>
但是,你实际上是在那里制作只写代码。如果你没有告诉我awk声明做了什么,那么很难弄明白。为什么不继续使用if
?
当你发现需要调整它时,你会在6个月内感谢自己。
答案 2 :(得分:0)
碰巧,你的“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)
}
我把分号拿出来了,但是如果你把它们留下来就没有什么不好的事了......