【发布时间】:2017-06-14 02:05:39
【问题描述】:
解决 AWK 递归难题。
我有一个递归任务,我必须填写一个数组。但是,我必须首先将数组作为参数传递。递归填充数组。为此,递归调用需要知道数组的长度,以便它们可以添加到数组的末尾。
唯一的问题是,在对参数运行函数后,我无法填充数组的第一个元素——length() 和 isarray() 在未知参数上运行似乎都强制它为标量类型.
所以在我使用长度之前,我需要一些方法来知道我是否是第一次添加到数组中。我宁愿不传递一个额外的参数来记录递归的深度,并告诉代码数组何时为空或不符合逻辑。但我知道这种解决方法。
以下是该问题的最小可验证示例:
最小可验证示例:
#! /bin/awk -f
BEGIN{
test(x)
}
function test(x, y){
y = length(x)
x[1] = 1 # <- fatal: attempt to use scalar parameter as an array
}
同时,这有效:
#! /bin/awk -f
BEGIN{
test(x)
}
function test(x, y){
# y = length(x)
x[1] = 1 # <- now it works
}
我需要做的是能够访问未初始化变量的长度(因为,在递归中,它通常会被初始化,但第一次,它不会)而不强制它是标量类型。我知道在数组中存储“长度”索引的解决方法。
如何在 awk 中完成此功能?
【问题讨论】: