2012-07-19 80 views
0

我写了一个awk脚本,现在我正在模块化过程中。我只想给我一个简单的例子。在awk中全局声明数组

awk 
BEGIN 
{ 
    declaring local variables 
} 

{ 
     if(variable==A) 
     { 
      array[A]++; 
      array1[A]++; 
     } 

} 
END 
{ 
     print contents of array and array1 
} 

我想这样做像下面的使用功能,我只是编辑动作块,这是

{ 
     addArrays(A); 
} 

function addArrays(A) 
{ 
     array[A]++; 
     array1[A]++; 
} 

如果我不喜欢这个,我只是想知道是否阵列和阵列1内容可以在END语句中访问。我怀疑是否数组1和数组2是在函数内部局部声明的。如果它是一个本地数组。我只需要知道如何将它作为全局数组,以便我可以在END函数中使用它。谢谢。

+0

你试过吗?它有用吗? – 2012-07-19 23:44:38

回答

3

变量和数组在AWK中是全局的。变量本地化的唯一方法是通过在参数列表中命名它们(即使所有参数都没有传入值,所以为了避免创建本地数组,请不要在参数列表中包含它的名称)

gawk手册:

自变量名不能从本地 变量名语法区分而是,当 函数被调用提供的参数的数量决定有多少参数变量有 因此,如果三个。参数值给出, PARAMETER-LIST中的前三个名称是参数,其余的a局部变量。

因此,如果参数的数量并不是在所有 调用该函数一样,有的在参数列表的名称可能是对其他一些场合和局部变量 参数。 想到这个的另一种方法是省略参数默认为空字符串。

通常,当您编写函数时,您知道 打算用于参数的数量名称以及您打算用作本地 变量的数量。通常在 参数和局部变量之间放置一些额外的空间,以便记录应该如何使用您的函数。

+0

感谢您的意见。所以函数内array和array1的变化会反映在最终仪式中。也就是说,我可以在END语句 – NandaKumar 2012-07-19 23:37:13

+0

@NandaKumar处得到array rite的更新值:只要你没有明确地使它们成为本地的,那么这些数组的值仍然可以在'END'块中使用。 – 2012-07-20 02:13:44