awk:循环变量命名的最佳实践

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()不一定在循环中调用。至于第二个,它可以使名称很长,这会降低可读性。

答案1

当我准备这个问题的时候,我找到了答案。欢迎其他答案。

在比较大的awk项目,比如翻译外壳使用第一个解决方案:

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

之后的参数####是本地的。

awk允许使用较少的参数调用函数,例如parseList(ast, tokens)or parseList(ast, tokens, lb, rb, sep)。因此,只有签名是复杂的。

相关内容