어레이용 휴대용 검사

어레이용 휴대용 검사

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
}

그러나 배열이 아닌 변수에서는 이식 가능하게 사용할 수 없습니다.

관련 정보