しかし、perl なら @a か $#a+1 、bash なら ${#a[@]} 、Ruby なら a.size または a.length などと書けるし、もしかして gawk でも簡単に記述できるのでは?と思って、man を見たところ、gawk-3.1.5 以降であれば、length(a) と書けることを知りました。
ただ、わたしの場合、仕事上、古いバージョンもサポートする必要があり、使えないのですが、ここにメモしておきます。
まずは、man gawk(1) から抜粋です。
length([s]) Returns the length of the string s, or the length of $0 if s is not supplied. Starting with version 3.1.5, as a non-standard extension, with an array argument, length() returns the number of elements in the array.次に、テストスクリプトです。
#!/bin/gawk -f # # test_length_array.gawk # # memo: # length(array) returns the number of elements with gawk-3.1.5 or later # see man gawk(1) # function my_len(a, len) { len=0 for (i in a) len++ return len } function chk_support_length_for_array() { return system("gawk 'BEGIN {a[1]=1;length(a);exit(0)}' >/dev/null 2>&1") } BEGIN { for (i=100; i<777+100; i++) { a[i]=i } if (PROCINFO["version"] == "") { f="gawk --version" ; f | getline ; ver=$3 ; close(f) printf "INFO: gawk-%s does not supports PROCINFO[\"version\"]\n", ver } else { ver=PROCINFO["version"] printf "INFO: gawk-%s supports PROCINFO[\"version\"]\n", ver } if (chk_support_length_for_array()) { printf "WARNING: gawk-%s does not supports length(array)\n", ver } printf "my_len(a)=%d\n", my_len(a) printf "length(a)=%d\n", length(a) exit(0) }配列に対する length をサポートするか確認する関数も書いてみました。あと、これも知らなかったのですが、gawk-3.1.4 以降であれば、PROCINFO["version"] という組み込み変数を使えるようです。これを、Fedora 14 で実行してみると、次のようになります。
[root@fedora14 ~]# ./test_length_array.gawk INFO: gawk-3.1.8 supports PROCINFO["version"] my_len(a)=777 length(a)=777古いシステムだと、次のようにエラーになります。
# ./test_length_array.gawk INFO: gawk-3.0.6 does not supports PROCINFO["version"] WARNING: gawk-3.0.6 does not supports length(array) my_len(a)=777 gawk: ./test_length_array.gawk:33: fatal: attempt to use array `a' in a scalar context
0 件のコメント:
コメントを投稿