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()
거기에서 함수를 정의하는 것이 쉬울 것입니다. 변수가 최소한 하나의 요소를 포함하는 배열인지 여부는 여전히 알 수 있습니다.
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
}
그러나 배열이 아닌 변수에는 이식성이 없습니다.