0

私は 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]++;
}

私がこれを気に入った場合、END ステートメントで array と array1 の内容にアクセスできるかどうかを知りたいだけです。私の疑問は、配列 1 と配列 2 が関数内でローカルに宣言されているかどうかです。ローカル配列の場合。これを END 関数で使用できるように、これをグローバル配列として作成する方法を知る必要があります。ありがとうございました。

4

1 に答える 1

4

変数と配列はAWKではグローバルです。変数をローカルにする唯一の方法は、引数リストで変数に名前を付けることです(すべての引数に値が渡されない場合でも。したがって、ローカル配列の作成を避けるために、引数リストにその名前を含めないでください。

gawkマニュアルから:

引数名は、構文的にローカル変数名と区別されません。代わりに、関数が呼び出されたときに提供される引数の数によって、引数変数の数が決まります。したがって、3つの引数値が指定されている場合、PARAMETER-LISTの最初の3つの名前は引数であり、残りはローカル変数です。

したがって、関数のすべての呼び出しで引数の数が同じでない場合、PARAMETER-LISTの名前の一部は、引数である場合とローカル変数である場合があります。これを考える別の方法は、省略された引数がデフォルトでnull文字列になることです。

通常、関数を作成するときは、引数に使用する名前の数と、ローカル変数として使用する名前の数がわかります。関数がどのように使用されるかを文書化するために、引数とローカル変数の間に余分なスペースを置くのが一般的です。

于 2012-07-19T23:19:00.120 に答える