휴대용 어레이 검사

휴대용 어레이 검사

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
}

그러나 배열이 아닌 변수에는 이식성이 없습니다.

관련 정보