может ли gensub () принимать вызовы функций как вторые аргументы? - PullRequest
0 голосов
/ 09 мая 2020

Вдохновленный этой задачей code-golf , я подумал, что с помощью 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

Итак, в заключение, что мне не хватает?

1 Ответ

3 голосов
/ 09 мая 2020

может ли gensub () принимать вызовы функций в качестве вторых аргументов?

Нет. AWK не является функциональным языком программирования; аргументы функции оцениваются непосредственно перед выполнением этой функции.

что мне не хватает?

toupper("&") дает & назад, "&"toupper("&") оценивается как "&&", следовательно, ee и oo.

И strtonum("&") возвращает 0, поэтому вы заменяете a, e, i, o и u с 0 есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...