私は奇妙な行動を見つけました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