在 awk 中克隆复杂数组

Fir*_*tin 4 awk gawk

我有一个这样的数组...

a["a"]                = "aa"
a["b"]                = "ab"
a["c"]                = "ac"
a["d"]["a"]           = "ada"
a["d"]["b"]["a"]      = "adba"
a["e"]["a"]["a"]["a"] = "aeaaa"
Run Code Online (Sandbox Code Playgroud)

...并想克隆它

clone(b, a)
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止尝试过的:

function clone(lhs, rhs){

    for (i in rhs) {
        if (typeof(arr[i]) == "array"){
            clone(lhs[i], rhs[i])
        } else {
            lhs[i] = rhs[i]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用,因为b["d"]a["d"]["a"]分配给b["d"]["a"]. 第二个问题是b["d"]应该输入为array.

Ste*_*itt 5

您需要在克隆之前初始化子数组:

function clone(lhs, rhs) {
    for (i in rhs) {
        if (isarray(rhs[i])) {
            lhs[i][1] = ""
            delete lhs[i][1]
            clone(lhs[i], rhs[i])
        } else {
            lhs[i] = rhs[i]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

gawk手册页中提到了写值然后删除它的技巧。

(我还修复了阵列检测,使用isarray.)