awkで関数が定義されているかどうかをテストする方法は?

awkで関数が定義されているかどうかをテストする方法は?

プログラムを書いていawkます。ソート機能が必要です。独自の関数を作成しましたが、可能であれば組み込み関数を使用したいと思います。mawkgawkasort()gawk

asort()この機能が利用可能かどうかをプログラム内でどのように知ることができますか?

gensub()より一般的には、特定の機能(例:)が利用可能かどうかをどのようにテストしますか?

ベストアンサー1

Awkに関数が存在するかどうかをテストするための移植可能な方法はありません。シェルからAwkスクリプトを呼び出す場合は、まずAwk呼び出しを作成して関数が存在するかどうかをテストできます。

if awk 'BEGIN {asort(a)}' <>/dev/null 2>/dev/null; then
  define_asort=
else
  define_asort='
function asort() { … }
'
fi
awk "$define_asort"'
  … rest of script …
'

GNU Awkを他の機能と区別したい場合は、他のGNU Awk機能をテストしてみてください。 Awkで未定義の関数を呼び出すと致命的なエラーが発生しますが、未定義の変数を使用すると常に問題はなく、NULL値を返します。PROCINFO[version]Gawk 3.1.4 以降、具体的に使用できます。これには Gawk バージョン番号が含まれます。

function my_sort(a) { … }
function sort_wrapper(a) { if (PROCINFO["version"]) asort(a); else my_sort(a); }

おすすめ記事