Скрипт-бокс
Многострочный сценарий, присваивание, условия, цикл FOR, критическая секция и итог выполнения.
Скрипт-бокс выполняет команды in-Line последовательно, строка за строкой. В нём можно присваивать значения, проверять условия, повторять блоки, изменять результат запуска и подключать заранее сохранённые фрагменты кода.
Как выполняются строки
Интерпретатор различает обычную команду, условный блок, цикл и служебную границу по началу строки. Поэтому положение команды и закрывающая строка являются частью синтаксиса.
|PARS|[1] = Ready выполняется один раз в текущем месте сценария.
|| или #FOR начинает последовательность вложенных строк.
||END, #ENDFOR или #endScript явно завершает соответствующую конструкцию.
Скрипт-бокс выполняется только при хорошем ответе и в самом конце обработки, перед выводом журнала. Не размещайте в нём действие, которое должно произойти до запроса или до получения результата парсера.
Многострочный код
#beginScript начинает многострочный блок, а #endScript завершает его. Переводы строк внутри присваиваемого значения сохраняются.
После выполнения первый парсер содержит две строки:
Начальная и конечная метки находятся на отдельных строках и образуют одну пару.
Без #endScript многострочный блок не имеет явной границы, поэтому следующую команду нельзя надёжно отделить от присваиваемого текста.
Присваивание
Обычный знак = изменяет значение слева. Это другой синтаксис, чем логический оператор равенства |=|.
Если первый парсер содержал Value, после команды он содержит ValueTest: правая часть сначала вычисляется из прежнего значения, затем результат записывается слева.
|DV|[Status] = Ready записывает Ready в существующую динамическую переменную.
|DV|[Status]|=|Ready возвращает истину или ложь и само значение не меняет.
Слева находится изменяемый парсер, динамическая переменная или другая поддерживаемая цель присваивания.
Запись Ready = |DV|[Status] пытается изменить постоянный текст, а не состояние проекта.
Комментарии
Строка, которая начинается с //, пропускается интерпретатором.
// временно не выполняем эту строку начинается со знака комментария.
|DV|[Status] = Ready // комментарий не является строкой комментария: // находится после команды.
Линейные условные блоки
Строка ||условие начинает блок, который выполняется только при истинном условии. Строка ||END завершает этот блок.
Если первый парсер больше 2, суффикс руб. добавляется к обоим парсерам. Если условие ложно, обе строки пропускаются.
||END стоит после последней условной строки, поэтому границы блока видны однозначно.
Если ||END не указан, условию подчиняется только первая следующая строка; остальные строки выполняются независимо.
Линейные блоки можно вкладывать в цикл #FOR, а цикл — в линейный блок. Каждую конструкцию закрывает собственная команда.
Цикл FOR
#FOR повторяет вложенные строки по целому диапазону. Счётчиком служит заранее созданная динамическая переменная.
|TO|идёт по возрастанию;|DOWNTO|идёт по убыванию;- начальная и конечная границы входят в диапазон;
- обе границы вычисляются один раз перед началом цикла;
#ENDFORзавершает текущий цикл;- циклы можно вкладывать друг в друга;
- глубина вложенности и общее количество повторов ограничены, чтобы ошибочный сценарий не выполнялся бесконечно.
До выполнения создайте динамическую переменную счётчика, например index, и все переменные, в которые цикл будет записывать результат. #FOR меняет их значения, но не создаёт их описание в проекте.
Сбор всех результатов
Цикл последовательно добавляет в result значения |REGEXCYCLE|[1], |REGEXCYCLE|[2] и далее до |REGEXCOUNT|[1] включительно.
Обратный порядок
result получает 3,2,1,.
1|TO|3 и 3|DOWNTO|1 явно задают направление и выполняют по три итерации.
Цикл без #ENDFOR не имеет границы; счётчик, которого нет среди динамических переменных проекта, не может хранить текущую итерацию.
BREAK и CONTINUE
#CONTINUE переходит к следующему значению ближайшего цикла. #BREAK немедленно завершает ближайший цикл.
result получает 1,2,4,5,6,: значение 3 пропускается, а перед добавлением 7 цикл завершается.
Каждая управляющая команда находится внутри #FOR ... #ENDFOR и относится к ближайшему циклу.
#BREAK или #CONTINUE вне цикла не имеет ближайшего цикла, которым можно управлять.
Критическая секция
|SYNCHOLE| = enter входит в критическую секцию, а |SYNCHOLE| = leave выходит из неё.
Критическая секция нужна, когда несколько параллельных потоков изменяют одно общее значение. Внутри оставляйте только чтение, вычисление и запись, которые должны произойти как единое действие.
Каждому enter соответствует leave, а защищённый участок остаётся коротким.
Выход до общей записи или отсутствие leave разрушает защиту и может задержать другие потоки.
Результат выполнения
|CONCLUSION| устанавливает итог текущего запуска.
Плохой результат.
Хороший результат.
Капча или блокировка.
Данные не подходят под настройки.
Эта команда устанавливает плохой результат. Используйте только перечисленные числовые коды; текст bad или произвольное число не описывают допустимый итог.
Полный пример
- Если первый парсер больше
0, первый условный блок заменяет его значение текстомЕсть баланс. - Если значение не равно
Есть баланси меньше0, второй блок устанавливает плохой результат. - При нуле ни одно действие не выполняется, потому что оба условия ложны.
Код из динамической переменной
|DV|[SharedCode] вставляет значение как обычный текст. |SB|[SharedCode] передаёт то же значение интерпретатору как код Скрипт-бокса.
Если динамическая переменная SharedCode содержит:
то строка:
выполняет обе команды. Переменная должна существовать, а её содержимое должно быть полноценным синтаксисом Скрипт-бокса.
Общий проверенный фрагмент хранится один раз и подключается через |SB| в нужных местах.
|DV|[SharedCode] не выполняет команды: он возвращает их текстовое представление.
Специальная функция SCRIPTBOX
|SCRIPTBOX| выполняет вложенный текст по правилам Скрипт-бокса из обычного выражения:
Функция изменяет состояние, возвращает пустую строку и должна быть конечной функцией выражения; предпочтительно использовать её и как начальную, как в примере выше.
Выражение используется ради присваивания |PARS|[1] = Ready, а не ради текстового результата функции.
Вложение |SCRIPTBOX| внутрь функции, которой нужен непустой текст, передаёт ей пустой результат.
Область видимости динамических и глобальных данных, а также влияние параллельных потоков разобраны отдельно на странице Состояние выполнения.