
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
}
但它不能在非數組變數上移植使用。