
Gawk hat „isarray“:
if (isarray(x))
print "is array"
else
print "is scalar"
Mawk und „gawk --posix“ tun dies jedoch nicht:
fatal: function 'isarray' not defined
Dies kann zu Problemen führen:
x
x[1]
fatal: attempt to use scalar 'x' as an array
Oder:
x[1]
x
fatal: attempt to use array 'x' in a scalar context
Kann Awk ein Array erkennen, ohne die Funktion „isarray“ zu verwenden?
Antwort1
Nein. Wenn das möglich wäre, hätte gawk nicht eingeführt werden müssenisarray()
.
Antwort2
Ich glaube auch nicht, dass es möglich ist.
Ich möchte jedoch hinzufügen awk
, dass Variablen bei busybox sowohl Arrays als auch Skalare sein können. Folgendes ist in Ordnung:
a = "foo"; a["foo"] = "bar"
Wenn eine Variable jedoch als Array verwendet wurde, length()
wird die Anzahl der Elemente im Array zurückgegeben, selbst wenn sie auch als Skalar definiert wurde (Sie können jedoch verwenden, length(var "")
um die Länge des Skalars abzurufen), außer wenn die Variable als Argument an eine Funktion übergeben und dort als Skalar zugewiesen wurde (könnte als Fehler betrachtet werden):
$ 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
Schade, denn sonst wäre es einfach gewesen, isarray()
dort eine Funktion zu definieren. Wir können immer noch erkennen, ob eine Variable ein Array mit mindestens einem Element ist, mit
function isnonemptyarray(x) {
return length(x) > 0 && length(x "") == 0
}
(vorausgesetzt, die Variable wurde nicht sowohl als Array als auch als Skalar definiert)
Das ist jedenfalls busybox
awk
spezifisch. length()
kann nicht portabel auf Arrays verwendet werden. Man kann eine portable array_length()
Funktion wie folgt definieren:
function array_length(a, tmp1, tmp2) {
tmp1 = 0
for (tmp2 in a) tmp1++
return tmp1
}
Dies kann jedoch nicht portabel auf Nicht-Array-Variablen angewendet werden.