9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWKの連想配列に潜むワナ

Last updated at Posted at 2014-11-04

読んでいるだけ、のつもりが……

連想配列の値を読んで、使っていない変数に代入する……。

一見無害のように見えますが、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"が追加される。

というわけでお取扱いにはご注意を。

9
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?