2017-01-30 8 views
0

私はAWKスクリプトを作成していますが、その時点でかなり大きな混乱がありました。(主にAwkスクリプトスキルを向上させたいからです)AWKカレー関数 - 関数が関数を返すことはできますか?

AwkやGawk内でオブジェクト指向プログラミングを行う方法ですが、少なくともカレー関数を使う方法はありますか?関数内から関数を返すときと同じように? (実行された機能の結果を返すのではなく、実行することができる機能を返さない)

私は@GreenFoxが可能でに格納されている機能の名称と機能を実行することを示した0​​を発見しました変数。彼が投稿した例は以下の通りです:

function foo(s){print "Called foo "s} 
function bar(s){print "Called bar "s} 
{ 
    var = ""; 
    if(today_i_feel_like_calling_foo){ 
     var = "foo"; 
    }else{ 
     var = "bar"; 
    } 
    @var("arg"); # This calls function foo(), or function bar() with "arg" 
} 

私は、別の機能から関数を返すことができるのだろうかと思っています。

例えば、awks printfで使用できる文字列を受け取り、2つの他の引数を受け入れ、実質的にprintf(fmt_from_parent_func, sub_func_arg1, sub_func_arg2)を実行する関数を返す関数です。ここで

は、次のことを達成しようとしているの私の試みです:

エラーになり
#! /usr/local/bin/awk -f 

function setFmt (fmt){ 
    function _print (var, val){ 
    printf (fmt ? fmt : "%-15s: %s\n"), str1, str2 
    } 
    return @_print 
} 
BEGIN { 
    fmtA = setFmt("%-5s: %s\n") 
    @fmtA("ONE","TWO") 
} 

awk: ./curry.awk:4: function _print (var, val){ 
awk: ./curry.awk:4: ^syntax error 
awk: ./curry.awk:4: function _print (var, val){ 
awk: ./curry.awk:4:        ^syntax error 
awk: ./curry.awk:6:  printf (fmt ? fmt : "%-15s: %s\n"), str1, str2 
awk: ./curry.awk:6:             ^unexpected newline or end of string 
awk: ./curry.awk:11: fmtA = setFmt("%-5s: %s\n") 
awk: ./curry.awk:11:       ^unexpected newline or end of string 
awk: ./curry.awk:12: @fmtA("ONE","TWO") 
awk: ./curry.awk:12:     ^unexpected newline or end of string 

これは可能な限り、誰もが知っている場合(イムは自分自身を見始めています)、そしてこの効果のために何かを達成する方法を知っている...それはすばらしいだろう。

ありがとうございます!

答えて

2

GNU awkを使用すると、関数の名前を別の関数から返すことはできますが、別の関数内で関数を宣言することも、任意のawkで関数(または配列)を返すこともできませんawkの関数からの戻り値は、スカラー値(つまり、数値または文字列)です。

は、あなたが何をしようとして、このです:

$ cat tst.awk 
function _print (var, val){ 
    printf _print_fmt, var, val 
} 

function setFmt (fmt){ 
    _print_fmt = (fmt ? fmt : "%-15s: %s\n") 
    return "_print" 
} 

BEGIN { 
    fmtA = setFmt("%-5s: %s\n") 
    @fmtA("ONE","TWO") 
} 

$ awk -f tst.awk 
ONE : TWO 
+0

ないかなり。これは、Awkの機能がステートフルでないため、これを実現する方法がないようです。 – Justin

+0

あなたは「あまりにも」について詳しく説明できますか?私が投稿したコードは何をしなければならないのですか?それを避けて、簡潔でテスト可能なサンプル入力と期待される出力で、あなたがしようとしていることを(あなたがそれをやろうとしているのとは反対に)見せることができれば、誰かがあなたはawkで慣用的にやろうとしていますか? –

関連する問題