我正在研究一個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
如果有誰知道,如果這是在所有可能的(這林開始看到自己),並知道一種方法來達到這個效果..那真是太棒了。
謝謝!
不太。看起來好像沒有辦法做到這一點,因爲Awk函數不是有狀態的。 – Justin
你能詳細說一下「不太」嗎?我發佈的代碼需要做什麼,它不這樣做?除此之外,如果您可以通過簡明,可測試的樣本輸入和預期輸出向我們展示您想要做什麼(而不是您如何嘗試這麼做),那麼我確信有人可以幫助您做任何事情你是否試圖在awk中習慣性地做。 –