Detectar argumento de função opcional (array)

2

Considere esta função:

function add_one(in_ar,   each) {
  for (each in in_ar) {
    in_ar[each]++
  }
}

Eu gostaria de modificá-lo de tal forma que, se uma segunda matriz for fornecida, seria usado em vez de modificar o array de entrada. Eu tentei isso:

function add_one(in_ar, out_ar,   each) {
  if (out_ar) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  add_one(q, z)
  print z[3]
}

mas obtenho este resultado:

fatal: attempt to use scalar 'z' as an array
    
por Steven Penny 26.06.2018 / 04:38

1 resposta

1

Existem 2 problemas no seu script

  • a variável z não foi inicializada
  • o teste if(out_ar) no segundo trecho de código não é adequado para matrizes

Para resolver o primeiro problema, você precisa atribuir um elemento de matriz (como z[1]=1 ), pois não há uma declaração de matriz no awk. (Você não pode usar uma declaração semelhante como declare -A como faria no bash).

O segundo problema pode ser resolvido, desde que você esteja usando o GNU awk, com a função isarray() ou typeof() .

Assim, seu código deve ficar assim:

function add_one(in_ar, out_ar,   each) {
  if (isarray(out_ar)) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  z[1]=1
  add_one(q, z)
  print z[3]
}

Recomendo ver esta página e esta página .

    
por 26.06.2018 / 08:51