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
我也不认为这有可能。
但我要补充一点,对于 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
}
但它不能在非数组变量上移植使用。