Awk

Gawk:將數組傳遞給函式

  • January 30, 2014

堅持使用 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$$ $$那麼在函式內部工作呢?

首先,將數組傳遞給函式 withfoo(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

引用自:https://unix.stackexchange.com/questions/72469