ポータブルアレイ検査

ポータブルアレイ検査

Gawkには「isarray」があります。

if (isarray(x))
  print "is array"
else
  print "is scalar"

しかし、Mawkと「gawk --posix」は、次のことを行いません。

fatal: function 'isarray' not defined

これは問題を引き起こす可能性があります。

x
x[1]
fatal: attempt to use scalar 'x' as an array

または:

x[1]
x
fatal: attempt to use array 'x' in a scalar context

Awkは「isarray」関数を使わずに配列を検出できますか?

答え1

習慣。可能であれば、gawkとして紹介する必要はありません。isarray()

答え2

私はそれが可能だとは思わない。

awkしかし、busyboxの場合、変数は配列とスカラーになる可能性があると付け加えたいと思います。そこにすることができます:

a = "foo"; a["foo"] = "bar"

変数が配列として使用されている場合、変数がすでにスカラーとして定義されていない限り、スカラーとして定義されていても(これを使用してスカラーの長さを取得length()できます)、配列内の要素の数を返します。length(var "")ソート。関数に引数として渡され、そこからスカラーとして割り当てられます(エラーと見なすことができます)。

$ 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

残念ながら、そうでなければ、isarray()そこで関数を定義するのは簡単です。変数が少なくとも1つの要素を含む配列であるかどうかはまだわかります。

function isnonemptyarray(x) {
  return length(x) > 0 && length(x "") == 0
}

(変数が配列とスカラーとして定義されていないと仮定)

とにかくこれはbusybox awk具体的です。length()配列で使用するための移植性はありません。array_length()移植可能な関数は、次の方法で定義できます。

function array_length(a, tmp1, tmp2) {
  tmp1 = 0
  for (tmp2 in a) tmp1++
  return tmp1
}

しかし、配列以外の変数には移植性はありません。

関連情報