match関数の第三引数とは #gawk
gawkを本格的に使おうとすると、match関数を使いこなさないといかんのだけど、この関数はアウトプットをグローバル変数とパラメータの配列への参照と戻り値の3つに出すという酷い仕様なんだよな
gawk の match関数でキャプチャーした部分文字列が格納される配列を入れる第三引数、実は今日まで知らなかったのだけれども、ググってみたら書いてない記事も多い(第二引数までしか書いてない)。比較的新しい仕様なんだろうか…
-
The GNU Awk User's Guide - 組み込み関数 April, 1999
- 1999年時点では match の引数は2つしかない
-
Man page of GAWK
- 2000年。こちらも2つだけ
-
gawk(1): pattern scanning/processing language - Linux man page
- 2009年。こちらだと第三引数が登場している!
gawk(1): pattern scanning/processing language - Linux man page より:
match(s, r [, a])
Returns the position in s where the regular expression r occurs, or 0 if r is not present, and sets the values of RSTART and RLENGTH. Note that the argument order is the same as for the ~ operator: str ~ re. If array a is provided, a is cleared and then elements 1 through n are filled with the portions of s that match the corresponding parenthesized subexpression in r. The 0'th element of a contains the portion of s matched by the entire regular expression r. Subscripts a[n, "start"], and a[n, "length"] provide the starting index in the string and length respectively, of each matching substring.
s においてで正規表現 r にマッチする位置を返す。もし存在しなければ 0 を返す。そして(グローバル変数の) RSTART と RLENGTH に値を設定する。引数の順番は ~ (チルダ)と同じである: str ~ re。配列 a が与えられている場合、a はクリアして、要素1~ n は r における対応する括弧式にマッチするsの部分(文字列)で満たされる。添字 a[n,"start"] と a[n,"length"] は、おのおののマッチする部分文字列の開始位置と長さを提供する。
脱線するけど英語表現が勉強になる
- elements 1 through n : 1~n の要素
- provide:与える、提供する的な
- portion:部分(最初 position の綴ミスかと思った。port-ion なのね)
:
最新の match 関数に対応していて、第三引数もちゃんと記述されている。それだけでなく、@include
や @load
など、俺の知らなかった新機能まで!すごいな「とほほのAWK入門」!
(でも、ライブラリまで使うなら、もう Go とか使ったほうがいいんじゃね?とか思ってしまう。そんなことよりも、改行コードを要素に含む CSV でも読めるようにしてほしいわ)
具体的なバージョンとしては
- 5.0.0 (git についてきたやつ)- OK
- 4.2 (「とほほ」で説明されてるやつ)- OK
- 3.1.5 (たまたま手元にあったやつ)- OK
サポートされてない gawk を探す方が難しいみたい。ちなみに、テスト用のワンライナー
gawk "BEGIN{ if( match(\"abcdefg\",\"bc(.)\",a)){ print a[1] } }"
gawk changelog match
で検索したところ、Feature History (The GNU Awk User’s Guide) という変更履歴のようなページが見つかった。これの
Version 3.1 of gawk introduced the following features:
のところに
The optional third argument to the match() function for capturing text-matching subexpressions within a regexp (see section String-Manipulation Functions).
という記述がある。つまり。gawk 3.1 から実装された機能で間違いなさそうだ。