Gawk:將數組傳遞給函式
堅持使用 GNU awk 3.1.6 並認為我已經解決了它的數組錯誤,但在 600 行 awk 程序中仍然存在看起來像範圍問題的問題。需要驗證對 awk 中數組範圍的理解以找到我的錯誤。
鑑於這個說明性的 awk 程式碼……
function foo(ga) { ga[1] = "global result" } garray[1] = "global" foo(garray) print garray[1]
將列印…
global result
由於數組總是通過引用傳遞給函式,所以所有數組總是全域的。無法創建本地數組。它是否正確?一直找不到明確說明這一點的文件。
由於我正在調試,並且 3.1.6 本身在這方面有已知的錯誤,我正在嘗試確定 awk 的錯誤在哪裡停止並開始我的錯誤。
補充:為什麼 ga$$ $$那麼在函式內部工作呢?
首先,將數組傳遞給函式 with
foo(ga)
實際上是不必要的。只需garray[]
在函式內部訪問它即可。然而,這樣做並沒有明顯的性能損失,它有助於調試和錯誤報告。在使用中
foo(ga)
,ga[]
是全域數組的同義詞garray[]
。它不是 的本地副本garray[]
,而是簡單的指向 的指針garray[]
,就像符號連結是指向文件的指針一樣,因此可以以多個名稱訪問同一個文件(或數組)。補充:格倫傑克曼回答的澄清
雖然在函式外部創建的數組對函式來說是全域的,並且可以傳遞給它或只是在其中引用,但在函式內部創建的數組確實保持在函式的本地,並且在函式外部不可見。修改傑克曼先生的例子說明了這一點……
awk ' function bar(x,y) { split("hello world", y) print "x[1] inside: " x[1] print "y[1] inside: " y[1] } BEGIN { x[1]="goodbye" print "x[1] before: " x[1] print "y[1] before: " y[1] bar(x) print "x[1] after: " x[1] print "y[1] after: " y[1] } ' x[1] before: goodbye y[1] before: x[1] inside: goodbye y[1] inside: hello x[1] after: goodbye y[1] after:
請注意,我們只是將
x[]
數組(實際上,只是一個指向它的指針)傳遞給bar()
. 在y[]
我們進入函式之前,數組甚至都不存在。但是,如果我們
y[]
通過將其包含在bar()
參數列表中進行聲明,而不在函式外部為其分配任何內容,則它在呼叫後變為可見bar(x,y)
…awk ' function bar(x,y) { split("hello world", y) print "x[1] inside: " x[1] print "y[1] inside: " y[1] } BEGIN { x[1]="goodbye" print "x[1] before: " x[1] print "y[1] before: " y[1] bar(x,y) print "x[1] after: " x[1] print "y[1] after: " y[1] } ' x[1] before: goodbye y[1] before: x[1] inside: goodbye y[1] inside: hello x[1] after: goodbye y[1] after: hello
最後,如果我們
y[]
在函式外部創建數組並用 傳遞它bar(x,y)
,split()
函式內部的賦值將替換該數組的元素……awk ' function bar(x,y) { split("hello world", y) print "x[1] inside: " x[1] print "y[1] inside: " y[1] } BEGIN { x[1]="goodbye" y[1]="howdy" print "x[1] before: " x[1] print "y[1] before: " y[1] bar(x,y) print "x[1] after: " x[1] print "y[1] after: " y[1] } ' x[1] before: goodbye y[1] before: howdy x[1] inside: goodbye y[1] inside: hello x[1] after: goodbye y[1] after: hello
函式參數是函式的本地參數。
awk ' function foo(x,y) {y=x*x; print "y in function: "y} BEGIN {foo(2); print "y out of function: " y} '
y in function: 4 y out of function:
如果傳遞給函式的值少於參數,則額外的參數只是空的。您有時可能會看到定義如下的函式
function foo(a, b, c d, e, f) {...
其中空格後面的參數是局部變數,不打算在呼叫時取值。
沒有理由這不適用於本地數組:
awk ' function bar(x) { split("hello world", x) print "in: " x[1] } BEGIN { x[1]="world" bar() print "out: " x[1]} '
in: hello out: world