AWK再帰パズルを解き明かします。AWK: "数値列"ではなく "配列"として初期化されていない変数を強制/キャスト
私は配列を埋めなければならない再帰的な作業があります。しかし、私はただパラメータとして配列を渡す必要があります。再帰が配列を塗りつぶします。これを行うためには、再帰呼び出しは配列の長さを知る必要があるので、配列の最後に追加することができます。
唯一の問題は、パラメータ上で関数を実行した後で配列の最初の要素を埋めることができないことです。length()
とisarray()
は未知のパラメータで実行されているため、スカラー型になっているようです。
だから、長さを使う前に初めて配列に追加するかどうかを知るには何か方法が必要です。私はむしろ、再帰の深さを記録する余分なパラメータを渡すことはなく、配列が空であるか論理的でないかをコードに伝えます。しかし、私はこの回避策を知っています。ここで
は、問題の最小検証例です。
最小検証例:
#! /bin/awk -f
BEGIN{
test(x)
}
function test(x, y){
y = length(x)
x[1] = 1 # <- fatal: attempt to use scalar parameter as an array
}
一方、この作品:
#! /bin/awk -f
BEGIN{
test(x)
}
function test(x, y){
# y = length(x)
x[1] = 1 # <- now it works
}
初期化されていない変数の長さにアクセスできるようにする必要があります(再帰では一般的に初期化されますが、最初はそれはありません)。スカラー型である。私は、配列に「長さ」のインデックスを格納する回避策を認識しています。
awkでこの機能をどのように達成できますか?
興味深い!関数本体で 'x [y + 1]'文 'length(x)'が失敗した後でも;私が推測するいくつかの変なこと。 – karakfa
ここにあります:https://stackoverflow.com/q/44529958/1435869 – karakfa