3
1

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.

gawk 5.0 の名前空間の使用例

Last updated at Posted at 2019-05-08

gawk5.0からは名前空間が使えるようになりました。行頭に @namespace "識別子" で名前空間を区別することができます。デフォルトでは"awk"です。

 10進-16進変換を例として書いてみます。16進→10進変換の関数h2d()、10進→16進変換の関数d2h()、これらに必要な変数や配列の初期化init()、およびデバッグ用のdebug()は名前空間 "hex"にあります。他の名前空間からは hex::h2d()のように呼び出します。変数の参照も同様にhex::D2H[1]のように書けばできます。
 ある名前空間内でグローバルに参照する変数はこの例のようにinit()のような関数内で設定することにして、呼び出し元の名前空間(ここではデフォルトの"awk")から一回呼び出してやればよいかと思います。

# gawk -M -f hex.awk # -M は多倍長演算サポート
BEGIN {
	hex::init()
	# hex::debug()

	t="deadbeefdeadbeefdeadbeefdeadbeef" ; print t,hex::h2d(t)
	t="142857142857" ; print t,hex::d2h(t)
	for(i in hex::D2H) print i,hex::D2H[i]

}


{
	print hex::h2d($1)
}


@namespace "hex"

func init() {
	a="0123456789ABCDEF"
	b="abcdef"
	for (i=0; i<=15; i++) {
		D2H[i]=substr(a,i+1,1)
		H2D[substr(a,i+1,1)]=i
	}
	for(i=0; i<=5; i++) H2D[substr(b,i+1,1)]=i+10
}

func h2d(h ,sum,m,i,t) {
	sum=0
	m=1
	for (i=length(h); i>=1; i--) {
		t=substr(h,i,1)
		if (H2D[t]=="") return -1
		sum+=H2D[t]*m
		m=m*16
	}
	return sum
}

func d2h(d ,sum,t) {
	sum = ""
	do {
		t=d % 16
		sum = D2H[t] sum
		d = int(d/16)
	} while (d>0)
	return sum
}

func debug() {
	print "*H2D"
	for (i in H2D) print i,H2D[i]
	print "*D2H"
	for (i in D2H) print i,D2H[i]
}
3
1
0

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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?