
Gawk tem "isarray":
if (isarray(x))
print "is array"
else
print "is scalar"
No entanto, Mawk e "gawk --posix" não:
fatal: function 'isarray' not defined
Isso pode causar problemas:
x
x[1]
fatal: attempt to use scalar 'x' as an array
Ou:
x[1]
x
fatal: attempt to use array 'x' in a scalar context
O Awk pode detectar um array sem usar a função "isarray"?
Responder1
Não. Se pudesse, não haveria necessidade de gawk apresentarisarray()
.
Responder2
Também não acho que seja possível.
Mas acrescentarei que com busybox awk
, as variáveis podem ser matrizes e escalares. Aí está tudo bem fazer:
a = "foo"; a["foo"] = "bar"
Porém, quando uma variável é usada como um array, length()
retorna o número de elementos no array, mesmo que também tenha sido definido como um escalar (embora você possa usar length(var "")
para obter o comprimento do escalar), exceto quando a variável tiver sido passado como argumento para uma função e atribuído como escalar (pode ser considerado um bug):
$ busybox awk 'BEGIN{a[1] = 1; a = "foo"; print length(a), length(a"")}'
1 3
$ busybox awk 'function f(x) {x = "xxx"; print x[1], length(x)}
BEGIN{a[1]=1; x = "yyy"; print a[1], length(a); f(a)}'
1 1
1 3
Que pena, caso contrário teria sido fácil definir uma isarray()
função ali. Ainda podemos dizer se uma variável é um array com pelo menos um elemento com
function isnonemptyarray(x) {
return length(x) > 0 && length(x "") == 0
}
(assumindo que a variável não foi definida como array e escalar)
De qualquer forma, isso é busybox
awk
específico. length()
não pode ser usado em arrays de forma portável. Pode-se definir uma array_length()
função portátil com:
function array_length(a, tmp1, tmp2) {
tmp1 = 0
for (tmp2 in a) tmp1++
return tmp1
}
Mas isso não pode ser usado de forma portável em variáveis que não sejam de array.