処理は次のとおりです。
a[$0]
:$0
連想配列のキーの値を見てくださいa
。存在しない場合は作成します。
a[$0]++
:の値をインクリメントし、a[$0]
式の値として古い値を返します。a[$0]
存在しない場合は、戻り0
、増分a[$0]
します1
(++
演算子は数値を返します)。
!a[$0]++
:式の値を否定します。a[$0]++
returnの場合0
、式全体がtrueと評価され、awk
実行されたデフォルトアクションが実行されますprint $0
。そうでない場合、式全体が偽と評価され、awk
何も起こりません。
参照:
ではgawk
、我々は使用することができます(またはdgawk awk --debug
新しいバージョンで)デバッグするgawk
スクリプトを。まず、gawk
という名前のスクリプトを作成しますtest.awk
。
BEGIN {
a = 0;
!a++;
}
次に実行します:
dgawk -f test.awk
または:
gawk --debug -f test.awk
デバッガーコンソールで:
$ dgawk -f test.awk
dgawk> trace on
dgawk> watch a
Watchpoint 1: a
dgawk> run
Starting program:
[ 1:0x7fe59154cfe0] Op_rule : [in_rule = BEGIN] [source_file = test.awk]
[ 2:0x7fe59154bf80] Op_push_i : 0 [PERM|NUMCUR|NUMBER]
[ 2:0x7fe59154bf20] Op_store_var : a [do_reference = FALSE]
[ 3:0x7fe59154bf60] Op_push_lhs : a [do_reference = TRUE]
Stopping in BEGIN ...
Watchpoint 1: a
Old value: untyped variable
New value: 0
main() at `test.awk':3
3 !a++;
dgawk> step
[ 3:0x7fe59154bfc0] Op_postincrement :
[ 3:0x7fe59154bf40] Op_not :
Watchpoint 1: a
Old value: 0
New value: 1
main() at `test.awk':3
3 !a++;
dgawk>
あなたが見ることができる、Op_postincrement
前に実行されましたOp_not
。
si
またはのstepi
代わりにs
またはstep
を使用して、より明確に表示することもできます。
dgawk> si
[ 3:0x7ff061ac1fc0] Op_postincrement :
3 !a++;
dgawk> si
[ 3:0x7ff061ac1f40] Op_not :
Watchpoint 1: a
Old value: 0
New value: 1
main() at `test.awk':3
3 !a++;