Portable Prüfung für Array

Portable Prüfung für Array

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 awkspezifisch. 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.

verwandte Informationen