便攜式陣列檢查

便攜式陣列檢查

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

不會。isarray()

答案2

我也不認為這是可能的。

但我要補充一點,對於 busybox awk,變數可以是陣列和標量。在那裡可以做:

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()在那裡定義一個函數。我們仍然可以判斷一個變數是否為至少包含一個元素的數組

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
}

但它不能在非數組變數上移植使用。

相關內容