While 文

while 文は、一連の命令を特定の条件が満たされるまでループ処理するときに使用します。

while 文を使用すると、指定した条件が満たされるまで、一連の操作を繰り返すことができます。Impact ポリシー言語の while 文は、 C、C++、Java などのプログラミング言語の while 文と同じです。

while 文の構文では、while キーワードの後に、ブール式を括弧で囲んで記述します。 この式の後には、ステートメントのブロックを中括弧で囲んで記述します。

while (condition) { statements }

ここで、condition はブール式、statements は 1 つ以上のステートメントのグループです。 例えば、以下のようになります。

I = 10;
while(I > 0) {
    Log("The value of I is: " + I);
    I = I - 1;
}

ポリシー内で while キーワードが検出されると、ブール式が評価され、TRUE かどうかが確認されます。式が TRUE と評価された場合は、以降のブロックのステートメントが実行されます。 ステートメントの実行後、 Netcool/Impact は式を再度評価して、 条件が FALSE と評価されるまで、引き続きステートメント・ブロックを繰り返し実行します。

while 文の最も一般的な使用方法は、ポリシー内の他の要素に応じて、一定の回数だけ実行されるループを作成することです。この方法で while 文を使用するには、整変数をカウンターとして使用します。 while ループの開始前にカウンターの値を設定し、ループ内でこの値を減らします。 while 文は、ループが実行されるたびにカウンターの値をテストして、カウンターがゼロになると終了します。

以下の例では、while 文の単純な使用方法を示します。


Counter = 10;
					
while (Counter > 0) {
    Log("The value of Counter is " + Counter);
    Counter = Counter - 1;
}

ここでは、値 10Counter という変数に割り当てています。 while 文では、ポリシーが Counter の値を評価して、ゼロより大きいかどうか調べます。 Counter がゼロよりも大きい場合、後続のブロック内のステートメントが実行されます。 ブロックの最後のステートメントでは、Counter の値が 1 つ減らされます。 この例の while ループは、10 回実行されると終了します。

この例を実行すると、以下のメッセージがポリシー・ログに出力されます。

The value of Counter is 10
The value of Counter is 9
The value of Counter is 8
The value of Counter is 7
The value of Counter is 6
The value of Counter is 5
The value of Counter is 4
The value of Counter is 3
The value of Counter is 2
The value of Counter is 1

以下の例では、while 文を使用して配列を反復処理する方法を示します。 この手法は、データ・ソースから取得したデータ項目を処理するときによく使用します。

MyArray = {"One", "Two", "Three", "Four"};
					
Counter = Length(MyArray);
					
while (Counter > 0) {
	Index = Counter - 1;
	Log(MyArray[Index]);
	Counter = Counter - 1;
}

ここでは、Counter の値を配列のエレメント数に設定しています。 while 文は、配列の各エレメントについて 1 回ずつ、ステートメント・ブロックをループ処理します。 Index 変数は、Counter の値から 1 を引いた値に設定されます。 これは、IPL 内の配列がゼロ・ベースの配列であるためです。つまり、最初のエレメントのインデックス値は、1 ではなく 0 になります。

この例を実行すると、以下のメッセージがポリシー・ログに出力されます。

Four
Three
Two
One

この例で、この手法を使用して配列内のエレメントを反復処理すると、逆の順序でエレメントにアクセスすることになります。 これは、ループ内でカウンター変数を減らすのではなく増やすことで回避できます。これには、while 文内で、カウンターが配列内のエレメント数未満であるかどうかをテストする必要があります。

以下の例では、カウンター変数の値を増やしながら、配列をループ処理する方法を示します。


MyArray = {"One", "Two", "Three", "Four"};
					
ArrayLength = Length(MyArray);
Counter = 0;
					
while (Counter < ArrayLength) {
    Log(MyArray[Counter]);
    Counter = Counter + 1;
}

このポリシーを実行すると、以下のメッセージがポリシー・ログに出力されます。

One
Two
Three
Four
注: 場合によっては、WHILE 文のブール条件が満たされない危険性があります。これにより、無限ループ・ポリシーが発生し、メモリー不足の問題の原因となることがあります。これを防止するために、NCI_server.propsmaxloopsize プロパティーを追加できます。例:

impact.policy.maxloopsize=50

IPL ポリシー内の WHILE ループが、maxloopsize プロパティーで指定した回数よりも多くループすると、ポリシーは WHILE ループを抜けて、以下のエラーが impactserver.log ファイルに生成されます。

ERROR [IPLImpactActionInterpreterVisitor] The policy: myWHILELoop has looped more than 50 times!