gawk中SYMTAB与函数参数类型不一致及数组初始化优化问询
gawk 通用数组初始化函数问题解答
一、为什么SYMTAB中的参数类型与变量本身不同?
gawk里函数的参数默认是局部变量,而SYMTAB是全局符号表,仅存储全局变量和用global关键字声明的变量。函数内部的局部参数不会被纳入全局符号表,所以你用SYMTAB["p"n]查找的其实是一个不存在的全局变量,结果自然是unassigned。而直接访问p...是操作函数的局部参数,因此能获取到正确的类型(string/number/untyped)。
二、更优的array_new函数实现方式
不需要依赖SYMTAB,也不用硬设置参数上限,利用gawk的可变参数扩展特性就能写出简洁的通用实现:
方案1:直接遍历所有传入参数(推荐)
gawk支持用...定义可变参数函数,@0表示传入的参数总数,@1到@N依次对应每个参数。直接遍历这些参数生成数组即可:
function array_new(...) { local arr for (i = 1; i <= @0; i++) { arr[length(arr) + 1] = @i } return arr }
调用示例:
BEGIN { my_arr = array_new(10, "foo", 3.14) for (idx in my_arr) { print idx, my_arr[idx] } }
输出:
1 10 2 foo 3 3.14
方案2:兼容“遇未初始化参数即停止”的逻辑
如果需要保留你原来的“参数上限内,碰到未传值的参数就终止”的行为,可以用gawk的间接引用访问局部参数(无需依赖SYMTAB):
# 这里设置参数上限为20,可按需调整 function array_new(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13,p14,p15,p16,p17,p18,p19,p20, arr,i) { arr = "" for (i = 1; i <= 20; i++) { param_name = "p" i if (typeof(@param_name) == "untyped") { break } arr[length(arr) + 1] = @param_name } return arr }
不过这种方式需要手动维护参数列表上限,灵活性不如方案1,优先推荐使用第一种实现。
内容的提问来源于stack exchange,提问作者cjnwl
相关产品推荐
相关产品推荐

