如何让awk的push函数支持传入未初始化的LIFO数组参数?
解决GNU Awk中未初始化数组传入push函数的报错问题
可以利用GNU Awk的typeof()函数判断参数类型,在push函数内部自动将未初始化的标量转换为数组,无需调用者提前做初始化或类型判断。以下是完整实现代码:
function push(lifo, val, type) { type = typeof(lifo) # 若参数是标量,将其转为空数组 if (type == "scalar") { delete lifo } # 执行入栈操作:数组长度+1的位置存入新值 lifo[length(lifo) + 1] = val } function pop(lifo, len, val) { len = length(lifo) if (len == 0) { return "" # 空栈返回空字符串,可按需调整返回值 } val = lifo[len] delete lifo[len] return val } # 测试示例 BEGIN { # 直接调用未初始化的变量 push(foo, 42) push(foo, 100) print pop(foo) # 输出100 print pop(foo) # 输出42 print pop(foo) # 输出空字符串 }
关键说明
typeof(lifo):获取参数的类型,未初始化的变量会被识别为scalar类型delete lifo:GNU Awk的特性,对标量执行delete操作后,该变量会自动转为数组类型,后续可正常作为栈结构使用- 函数内部自动兼容标量和数组参数,调用时无需提前判断变量状态,直接调用即可避免报错
内容的提问来源于stack exchange,提问作者Renaud Pacalet
相关产品推荐
相关产品推荐

