読んでいるだけ、のつもりが……
連想配列の値を読んで、使っていない変数に代入する……。
一見無害のように見えますが、AWKの場合、連想配列の内容を書き換えてしまうことになります。
実例を見てみる
では、実際にコードを見てみましょう。
awk_test.sh
#! /bin/sh
awk '
BEGIN{
split("", array); # 連想配列を初期化(要素数0にする)
print length(array); # 要素数は当然"0"と表示されますよね。
print array["hoge"]; # だから"hoge"なんて要素を表示しようとしても当然空です。
print length(array); # もう一度要素数を見てみましょう。
}'
# POSIXなAWK(配列に対するlength関数の無いAWK)をお使いの方は
# 下記の行を追記し、上記の"length"を全て"arlen"に書き換えてください。
function arlen(ar,i,l){for(i in ar){l++;}return l;}
さてこのコード、実行したらどうなると思いますか?最初の行に0が表示され、次の行は空行で、その次の行にまた0が表示されると思いますよね。ところが、そうはならないんです。
実行結果
$ ./awk_tesh.sh
0
1
$
なんと!要素を読んだだけで要素数が増えてしまいました。
AWKの連想配列の仕様
実はAWKの連想配列には次のような仕様が存在します。
AWKは、連想配列Aの中に存在しない要素"e"を読むと、その瞬間に中身が空の要素"e"が追加される。
というわけでお取扱いにはご注意を。