awk: лучшая практика для именования переменных цикла

Следующий код приводит к бесконечному циклу, потому что awk не поддерживает локальную переменную в области видимости { … } .

 #! /usr/bin/gawk -f function myfunction() { for (i = 5; i < 8; i++){ print "in myfunction(), i="i } } BEGIN { for (i = 0; i < 10; i++) { myfunction(); print i; } } 

Есть два способа решения этой проблемы:

  1. Объявите переменную цикла i качестве аргументов , например, myfunction( i) .

Обратите внимание на дополнительный пробел перед тем, как i является соглашением о кодировании, чтобы указать, что i является локальной переменной, а не аргументом .

  1. Используйте соглашение об именах для предотвращения «столкновения» , например, _module_begin_loop , _module_myfunction_loop .

Я обнаружил, что первое решение довольно сложно для переменной цикла, так как myfunction() не обязательно вызывается в цикле. Что касается второго, он может сделать длинное имя, что уменьшит читабельность.

    Я нашел ответ, когда готовил этот вопрос. Другие ответы приветствуются.

    В относительно большом awk- проекте, подобном translate-shell, используется первое решение:

     function parseList(returnAST, tokens, leftBrackets, rightBrackets, separators, #### i, j, key, p, stack, token) { ... } 

    параметры после #### являются локальными.

    awk позволяет вызывать функцию с меньшим количеством параметров, например parseList(ast, tokens) или parseList(ast, tokens, lb, rb, sep) . Следовательно, только подпись является сложной.