以下代码会导致无限循环,因为 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;
}
}
有两种方法可以解决这个问题:
- 将循环变量声明
i
为参数,例如myfunction( i)
。
笔记前面的额外空格i
是编码约定,表示它i
是局部变量,而不是参数。
- 使用命名约定来防止“冲突”,例如
_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)
。因此,只有签名是复杂的。