2017-01-30 204 views
0

我正在研究一個AWK腳本,現在相當麻煩,我試圖改進它(主要是因爲我想改進我的Awk腳本技巧)AWK咖喱函數 - 函數可以返回一個函數嗎?

我意識到沒有一種在Awk或Gawk中執行面向對象編程的方法,但是有沒有辦法可以至少實現咖喱功能?如同從函數內部返回函數一樣? (不返回執行函數的結果,而是返回可以執行的功能)

我發現了一個Stack Overflow post,其中@GreenFox表明它可能與存儲在函數的名稱執行功能一個變量。他發佈的例子如下:

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" 
} 

我想知道的是,如果它可能從另一個函數返回一個函數。

例如,一個函數接受一個字符串,該字符串可以作爲格式在printf中使用,並返回接受兩個其他參數的函數,並且本質上執行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中習慣性地做。 –