Операторы While
Операторы while позволяют задать цикл инструкций, которые будут повторяться, пока не будет выполнено определенное условие.
Оператор while служит для повторения набора операций, пока заданное условие не будет выполнено. Оператор while
в языке IPL аналогичен оператору, который используется в таких языках программирования, как C, C++ и Java.
Синтаксис оператора while - это ключевое слово while, после которого идет логическое выражение, заключенное в скобки. После выражения следует блок операторов, заключенных в фигурные скобки.
while (условие) { операторы }
где условие - логическое выражение, а операторы - группа, состоящая из одного или нескольких операторов. Примеры:
I = 10;
while(I > 0) {
Log("Значение I равно: " + I);
I = I - 1;
}
Обнаружив в политике ключевое слово while, программа оценивает логическое выражение, чтобы увидеть, разрешается ли оно в значение true. Если выражение разрешается в значение true, выполняются операторы в следующем за ним блоке.
После выполнения операторов Netcool/Impact снова проверит выражение и
будет повторно выполнять блок операторов, пока оценка условия не возвратит значение false.
Наиболее распространенным способом использования оператора while является создание цикла, выполняемого определенное число раз в зависимости от других факторов в политике. Чтобы использовать таким образом оператор while, вы используете целочисленную переменную как счетчик. Вы задаете значение счетчика до начала цикла while, и уменьшаете его значение внутри цикла. Оператор While проверяет значение счетчика каждый раз, когда выполняется цикл, и завершает работу, когда значение счетчика становится равно нулю.
В следующем примере показано простое использование оператора while:
Counter = 10;
while (Counter > 0) {
Log("Значение счетчика равно " + Counter);
Counter = Counter - 1;
}Здесь вы присваиваете значение10 переменной с именем Counter. В операторе while политика проверяет значение Counter, чтобы определить, будет ли оно больше нуля. Если значение Counter больше 0, программа выполнит операторы, находящиеся внутри следующего блока. Последний оператор в блоке задает уменьшение значения Counter на единицу. Цикл While в данном примере выполняется перед завершением 10 раз.
При выполнении этого примера в журнал политики записывается следующее сообщение:
Значение Counter равно 10
Значение Counter равно 9
Значение Counter равно 8
Значение Counter равно 7
Значение Counter равно 6
Значение Counter равно 5
Значение Counter равно 4
Значение Counter равно 3
Значение Counter равно 2
Значение Counter равно 1В следующем примере показано, как использовать оператор While для перебора значений массива. Этот метод часто используется при обработке элементов данных, извлеченных из источника данных.
MyArray = {"Один", "Два", "Три", "Четыре"};
Counter = Length(MyArray);
while (Counter > 0) {
Index = Counter - 1;
Log(MyArray[Index]);
Counter = Counter - 1;
}Здесь в качестве значения Counter вы задаете число элементов в массиве. Оператор While позволяет повторить блок операторов по одному разу для каждого элемента массива. Для Index вы задаете значение, равное значению Counter минус единица. Это связано с тем, что отсчет элементов в массивах IPL ведется от нуля. Это означает, что значение индекса первого элемента равно 0, а не 1.
При выполнении этого примера в журнал политики записывается следующее сообщение:
Четыре
Три
Two
ОдинВ этих примерах, когда вы используете этот метод для перебора элементов в массиве, вы получаете доступ к элементам в обратном порядке. Чтобы этого избежать, можно задать приращение переменной счетчика вместо ее пошагового уменьшения внутри цикла. Для этого нужно проверять, будет ли значение счетчика меньше числа элементов в массиве внутри оператора While.
В следующем примере показано, как выполняется цикл для массива при приращении значения переменной счетчика.
MyArray = {"Один", "Два", "Три", "Четыре"};
ArrayLength = Length(MyArray);
Counter = 0;
while (Counter < ArrayLength) {
Log(MyArray[Counter]);
Counter = Counter + 1;
}При выполнении этой политики в журнал политики записывается следующее сообщение:
One
Two
Три
ЧетыреWHILE; это
может привести к политике бесконечного зацикливания, которая может привести к ошибке нехватки памяти. Чтобы не допустить этого, в файл NCI_server.props можно добавить свойство maxloopsize. Например: impact.policy.maxloopsize=50
Если цикл WHILE в политике IPL повторяется большее число раз, чем это указано свойством maxloopsize,
политика разрушит цикл WHILE и в файле impactserver.log будет сгенерирована следующая ошибка:
ОШИБКА
[IPLImpactActionInterpreterVisitor] Политика: повторение цикла myWHILELoop более 50 раз!