2017-01-30 6 views
0

AWK 스크립트를 작성 중입니다. AWK 스크립팅 기술을 개선하고 싶기 때문에 주로 개선하고 있습니다.AWK 카레 함수 - 함수가 함수를 반환 할 수 있습니까?

나는 존재하지 않는다는 것을 알고 있습니다. Awk 또는 Gawk 내에서 객체 지향 프로그래밍을 수행하는 방법이지만 최소한 카레 기능을 수행 할 수있는 방법이 있습니까? 함수 내에서 함수를 반환 할 때와 마찬가지로? (실행 된 함수의 결과를 반환 아니라 실행될 수있는 함수 반환하지) I는 @GreenFox 그 수에 저장된 함수의 이름과 기능을 실행할 수 있음을 보여 주었다 Stack Overflow post을 발견

을 변수. 그가 게시 한 예제는 아래와 같습니다 :

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 

(임 자신을보기 시작하는), 그리고이 효과에 무언가를 성취 할 수있는 방법을 안다. 그것은 굉장 할 것이다.

감사합니다.

답변

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에서 관용적으로 행동하려고합니다. –