
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
}
그러나 배열이 아닌 변수에서는 이식 가능하게 사용할 수 없습니다.