삭제된 배열 인덱스가 표현식에서 사용된 후 awk에 다시 나타납니다.

삭제된 배열 인덱스가 표현식에서 사용된 후 awk에 다시 나타납니다.

나는 이상한 행동을 발견했습니다 awk. 배열 요소를 삭제하고 싶지만 삭제 후 코드 어딘가에서 요소를 사용하면(값 없음 인덱스만) 해당 요소가 다시 나타납니다. 이것이 예상되는 동작입니까?

awk '
# This function just for clarity and convenience.
function check(item) {
    if(item in arr) 
        printf "the array index \"%s\" exists\n\n", item 
    else 
        printf "the array index \"%s\" does not exist\n\n", item 
}

END {
    # Create element of array with index "f"
    arr["f"] = "yes"

    printf "The value of arr[\"f\"] before deleting = \"%s\"\n", arr["f"]

    # The first checking of the array - the index exists
    check("f")

    # Then delete this element
    # I am expecting no this element in the "arr" now
    delete arr["f"]

    # The second checking of the array - the index does not exist
    # as I were expecting
    check("f")

    # Use the non-existent index in expression
    printf "The value of arr[\"f\"] after deleting = \"%s\"\n", arr["f"]

    # The third checking of the array - the index exists again
    check("f")
}' input.txt

산출

The value of arr["f"] before deleting = "yes"
the array index "f" exists

the array index "f" does not exist

The value of arr["f"] after deleting = ""
the array index "f" exists

답변1

이는 예상된 동작입니다. 변수가 아직 존재하지 않는 경우 변수 값을 참조하면 변수가 생성됩니다. 그렇지 않으면 다음과 같은 구문 오류가 발생합니다.

$ awk 'BEGIN { print "Foo is " foo[0]; foo[0]="bar"; print "Foo is " foo[0]; delete foo[0]; print "Foo is " foo[0] }'
Foo is
Foo is bar
Foo is

이는 배열이 아닌 변수의 경우에도 마찬가지이지만 단순 변수(때때로)에는 연산자가 없기 때문에 delete배열이 질문에 포함되지 않은 경우에는 자주 나타나지 않습니다.

답변2

현재 발생하고 있는 동작은 이 줄이 이전에 삭제한 배열 항목을 자동으로 다시 생성하기 때문입니다.

printf "The value of arr[\"f\"] after deleting = \"%s\"\n", arr["f"]

이 작은 테스트를 살펴보십시오.

$ awk 'BEGIN{a[1];delete a[1];for (i in a) print i}'
# nothing is printed
$ awk 'BEGIN{a[1];delete a[1];a[1];for (i in a) print i}'
1
$ awk 'BEGIN{a[1];delete a[1];print "a[1]=",a[1];for (i in a) print "key found:",i}'
a[1]= 
key found: 1

관련 정보