簡體   English   中英

AWK Curry函數-函數可以返回函數嗎?

[英]AWK Curry Function - Can a function return a function?

我目前正在處理一個相當混亂的AWK腳本,並且我正在嘗試對其進行改進(主要是因為我想提高自己的Awk腳本技術)

我意識到沒有辦法在Awk或Gawk中進行面向對象的編程,但是至少有咖喱函數可以嗎? 就像從函數內部返回函數一樣? (不返回執行函數的結果,而是返回可以執行的函數)

我發現了一個Stack Overflow帖子 ,其中@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"
}

我想知道的是是否有可能從另一個函數返回一個函數。

例如,一個函數接受可以在awks 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

如果有人知道這是完全有可能的(林先生開始看到我自己),並且知道一種達到這種效果的方法。那真是太棒了。

謝謝!

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM