2015-10-25 96 views
4

我正在尋求一種方法來按名稱調用awk函數,即通過使用用戶輸入的字符串。在Awk中,如何通過使用字符串名稱來調用函數?

我的目標是取代了很多這樣的代碼......

if (text == "a") a(x) 
if (text == "b") b(x) 
if (text == "c") c(x) 

...任何一種方式使用字符串名稱這樣的事情分派給該函數:

send(text, x) 

在其他語言中,這種效果有時被描述爲反射,消息發送或動態分派,或者按名稱獲取函數指針。

我正在尋找一種方法來使用gawk,理想情況下也使用POSIX便攜式awk

回答

7

使用GNU AWK 4.0或更高版本爲Indirect Function Calls

$ cat tst.awk 
function foo() { print "foo() called" } 
function bar() { print "bar() called" } 

BEGIN { 
    var = "foo" 
    @var() 

    var = "bar" 
    @var() 
} 

$ awk -f tst.awk 
foo() called 
bar() called 
+1

感謝埃德,這是完美的。你有沒有建議如何使用純POSIX而不是gawk? (對於這個腳本,POSIX可移植性是幾個月內的目標)。 – joelparkerhenderson

+4

是的,等待5年POSIX趕上gawk :-)。不,對不起,在POSIX中沒有好的辦法。 –

2
#!/usr/bin/awk -f 
func alpha() { 
    print "bravo" 
} 
BEGIN { 
    charlie = "alpha" 
    @charlie() 
} 

輸出:

bravo 

GNU awk - Git Repositories

相關問題