Clonar matriz complexa no awk

3

Eu tenho uma matriz como essa ...

a["a"]                = "aa"
a["b"]                = "ab"
a["c"]                = "ac"
a["d"]["a"]           = "ada"
a["d"]["b"]["a"]      = "adba"
a["e"]["a"]["a"]["a"] = "aeaaa"

... e quer cloná-lo

clone(b, a)

Isso é o que eu tentei até agora:

function clone(lhs, rhs){

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

Mas isso claramente não funciona porque b["d"] não é criado antes que a["d"]["a"] seja atribuído a b["d"]["a"] . O segundo problema é que b["d"] deve ser digitado como array .

    
por Firmin Martin 14.07.2018 / 17:58

1 resposta

4

Você precisa inicializar o subarray antes de clonar:

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]
        }
    }
}

O truque write-then-delete é mencionado na página gawk man.

(Eu também consertei a detecção do array, usando isarray .)

    
por 14.07.2018 / 18:07

Tags