首页 > 解决方案 > gensub() 可以接受函数调用作为第二个参数吗?

问题描述

受到这个代码高尔夫挑战的启发,我认为使用 awk 很容易实现最终结果。该算法将是:将所有内容转换为小写,然后仅将元音转换为大写。

我认为这可以工作

awk '{$0=tolower($0);print gensub(/[aeiou]/,toupper("&"),"g")}'
> HeLlO
> hello

但它所做的只是以小写形式回显输入。然后,我只是摆弄它:

$ awk '{$0=tolower($0);print gensub(/[aeiou]/,"&"toupper("&"),"g")}'
> HeLlO
> heelloo

我正要得出结论,也许解析器正在阅读"&""&",因为 awk 有时会非常宽容。但是后来,我尝试了其他功能:

$ awk '{$0=tolower($0);print gensub(/[aeiou]/,strtonum("&"),"g")}'
> HeLlO
> h0ll0

所以,总而言之,我错过了什么?

标签: awk

解决方案


gensub() 可以接受函数调用作为第二个参数吗?

不,Awk 不是函数式编程语言。函数的参数在该函数执行之前立即进行评估。

我错过了什么?

toupper("&")返回&"&"toupper("&")计算结果为"&&",因此eeoo

strtonum("&")返回0,因此您要替换a, e, i, oand 。u0


推荐阅读