awk - 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
所以,总而言之,我错过了什么?
解决方案
gensub() 可以接受函数调用作为第二个参数吗?
不,Awk 不是函数式编程语言。函数的参数在该函数执行之前立即进行评估。
我错过了什么?
toupper("&")
返回&
,"&"toupper("&")
计算结果为"&&"
,因此ee
和oo
。
并strtonum("&")
返回0
,因此您要替换a
, e
, i
, o
and 。u
0
推荐阅读
- php - Laravel 5.6:从下拉列表中获取选定的值以在另一个中使用它
- java - 为什么 Java 没有 EmptyQueueException?
- webstorm - WebStorm 2018.3 Run/Debug 启动直接报错
- java - 多个类的静态引用
- typescript - Angular 6读取XLS文件并将其保存到变量中
- html - 使用 CSS 实现百分点
- sorting - 数据表 - 包含年龄范围/YADCF 累积过滤器的排序列(使用 columnDefs )
- php - 使用完全限定路径名 (FQPN) 请求文件时是否执行任何类型的搜索
- c - 带有循环的 C 程序中的老虎机
- javascript - 在MYSQL数据库中导出并使字符串有效期为7天