다음 기능을 고려해보세요:
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]=1
awk에는 배열 선언이 없기 때문에 배열 요소(예: )를 할당해야 합니다. ( declare -A
bash에서와 유사한 명령문을 사용할 수 없습니다 ).
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]
}