Eu encontrei um comportamento estranho no arquivo awk
. Eu queria excluir um elemento da matriz, mas descobri que esse elemento (apenas um índice, sem valor) aparece novamente, se eu o usar em algum lugar do código após a exclusão. Esse é o comportamento esperado?
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
Resultado
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
O comportamento que você encontra ocorre porque esta linha recria silenciosamente o item da matriz que você excluiu antes:
Veja este pequeno teste:
Este é o comportamento esperado. Referenciar o valor de uma variável irá criá-la se ela ainda não existir. Caso contrário, o seguinte seria um erro de sintaxe:
Isso é verdade mesmo para variáveis sem matriz, mas como não há
delete
operador (às vezes) para variáveis planas, isso não ocorre com frequência sem que as matrizes estejam envolvidas na questão.