선택적 함수 인수(배열) 감지

선택적 함수 인수(배열) 감지

다음 기능을 고려해보세요:

function add_one(in_ar,   each) {
  for (each in in_ar) {
    in_ar[each]++
  }
}

두 번째 배열이 제공되면 입력 배열을 수정하는 대신 사용되도록 수정하고 싶습니다. 나는 이것을 시도했습니다 :

function add_one(in_ar, out_ar,   each) {
  if (out_ar) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  add_one(q, z)
  print z[3]
}

그러나 나는 다음과 같은 결과를 얻습니다.

fatal: attempt to use scalar `z' as an array

답변1

스크립트에 2가지 문제가 있습니다.

  • 변수가 z초기화되지 않았습니다.
  • 두 번째 코드 조각의 테스트가 if(out_ar)배열에 맞지 않습니다.

첫 번째 문제를 해결하려면 z[1]=1awk에는 배열 선언이 없기 때문에 배열 요소(예: )를 할당해야 합니다. ( declare -Abash에서와 유사한 명령문을 사용할 수 없습니다 ).

isarray()GNU awk를 사용하면 또는 함수를 통해 typeof()두 번째 문제를 해결할 수 있습니다.

따라서 코드는 다음과 같아야 합니다.

function add_one(in_ar, out_ar,   each) {
  if (isarray(out_ar)) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  z[1]=1
  add_one(q, z)
  print z[3]
}

한번 보시길 권합니다이 페이지그리고이 페이지.

관련 정보