Оператор проверки по шаблону




Переменные

 

Общая длина имени локальной или глобальной переменной не ограничена, правда, определяющими являются только первые 31 символ. Первым символом должна быть строчная или прописная буква, либо символ %. Все остальные символы могут представлять собой смесь букв или цифр из 7-битного набора символов ASCII. Знаки препинания, исключая точку, которая может быть использована в любой позиции имени глобальной переменной, кроме первой и последней, запрещены. Имена переменных чувствительны к регистру. COS поддерживает два класса переменных: локальные и глобальные переменные. Оба вида переменных могут существовать в виде скалярных и многомерных структур.

Локальные переменные существуют только в памяти во время процесса, в котором они были объявлены, и доступны только в пределах данного процесса.

Глобальные переменные доступны всем активным процессам и порождаются двумя способами: прямым созданием в приложении и автоматическим для элементов, хранящихся в БД. Такие переменные называются Глобал. Имена Глобал начинаются с символа «^» - циркумфлекс.

Основное назначение Глобал - предоставление доступа к сохраненным объектам ПРБД.

В Cache ObjectScript отсутствует декларирование переменных: единственный тип данных – это строка символов переменной длины, то есть все переменные — это переменные типа string. Тем не менее, внутренними средствами системы результат арифметической или логической операции интерпретируется как число или, соответственно, как логическое значение.

Системные, или специальные переменные представляют собой следующую категорию переменных. Внутри Cache ObjectScript они являются предопределенными и могут изменяться программно лишь в редких случаях. Их признаком является символ $. Также есть ряд системных переменных, имена которых начинаются с символа «$».

В таблице 1 представлены важнейшие системные переменные. Если часть имени системной переменной заключена в квадратные скобки, имя может быть сокращено до знака доллара и первой буквы имени переменной.

Таблица 1. Системные переменные.

Системная переменная Краткое описание
$HALT Если $HALT содержит имя программы, эта программа будет вызвана при выполнении команды Halt.
$H[orolog] $Horolog содержит дату и время в форме 2 счетчиков, отделенных друг от друга запятой. Первый счетчик показывает количество дней, начиная с пятницы, 31 декабря 1840 года (нулевой день), второй счетчик – количество секунд, начиная с полуночи. Обратите внимание также на специальную переменную $ZTimeStamp, аналогичную переменной $Horolog, но показывающую дополнительно еще и миллисекунды.

 

>Write $Horolog // выводит «57713,36814» >Write $Piece($Horolog, ", ", 2) // выводит «36815» >Write +$Horolog // выводит «57713»
$I[O] $IO содержит имя используемого в текущий момент устройства ввода-вывода.
     

 

>Use "TTA3:" Write $I0 // выводит «TTA3:»
$J[ob] $Job содержит положительное целое число, однозначно идентифицирующее каждый текущий процесс в данной системе. $Job не изменяется, пока данный процесс является активным.
     

 

>Write $Job // выводит «1024» >Set ^temp($Job) = "String"
$K[ey] $Кеу содержит символ или последовательность символов, которым завершилась последняя команда Read. Сравните ее с эквивалентной с функциональной точки зрения переменной $ZB.
     

 

>Write $Key // выводит «<Return>»
$P[rincipal] Подобно $IO, $Principal содержит имя устройства, с которого был запущен текущий процесс.
     

 

>Write $Principal // выводит «/dev/tty05»
$Q[uit] Вызванная в пользовательской функции переменная $Quit всегда имеет значение 1, в противном случае (в подпрограмме) – значение 0.
     

 

>Write $Quit «1»
$S[torage] Содержит количество байт, предоставленных для хранения локальных переменных в текущем процессе. Смотри также $ZStorage.
     

 

>Write $Storage “15845”
$T[est] $Test содержит значение только что вычисленного тестового условия. $Test устанавливается при использовании If с аргументом, а также в командах Open, Lock, Read и Job с таймаутом. Безаргументные команды If и Else (также как и постусловие) не меняют значения $Test. $Test при вызове пользовательских функций и специальных переменных, а также программного блока неявно обрамляется безаргументной командой Do и по окончании вызова вновь устанавливается в старое значение.
     

 

>If a = 5 Write $Test // выводит «1» (если а = 5) >Open dev::10 Write $Test // выводит «1» (если Open проходит в течение 10 сек.)
$X отражает горизонтальную позицию курсора по отношению к началу строки на устройстве вывода. Каждый выводимый печатный символ увеличивает значение системной переменной $X на 1. Максимальное значение составляет 255 и далее сбрасывается в ноль.
     

 

>If $X > 79 Write!
$Y $Y отражает вертикальную позицию курсора по отношению к устройству вывода. Каждый символ перевода строки (ASCII 10) увеличивает, значение $Y на 1 до тех пор, пока, достигнув максимального значения (255), оно снова не сбросится в ноль.
     

 

>If $Y > 59 Write #
$ZA Статус последней команды Read на текущем устройстве.

 

>Write $ZA # 21
$ZB Функционально эквивалентна $Кеу, содержит символ или последовательность символов, считанных последнюю команду Read.
     

 

>Write $ZB // выводит «<Return>»
$ZC[hild] Если текущий процесс Cache, используя команду Job, запустил новый процесс, $ZChild содержит его идентификатор. Значение равно 0, если новый процесс не стартовал.
     

 

>Write $ZChild // выводит «37»
$ZEOF $ZEOF является признаком достижения конца файла после выполнения операции чтения из него. Если был достигнут конец файла, $ZEOF устанавливается в 1.
     

 

>If $ZEOF Close file
$ZH[orolog] $ZHorolog содержит время в секундах и миллисекундах со времени старта Cache.
     

 

>Write $ZHorolog // выводит «2365.63»
$ZI[O] $ZIO содержит информацию о типе терминального устройства. Если речь идет, например, о связи через Telnet, то $ZIO содержит IP – адрес клиента в форме nnn.nnn.nnn.nnn/port, или, если работает распознавание имен, Name/port где Name — имя клиентской машины.
     

 

>Write $ZIO // выводит «192.9.200.79/1260»
$ZJ[ob] $ZJob содержит число, которое содержит специальную информацию о текущем процессе, представленную в виде битовой строки.
     

 

 
$ZM[ode] $ZMode содержит параметры устройства, заданные в последней команде Open или Use.
     

 

>Write $ZMode «RY\ISM\»
$ZN[ame] $ZName содержит имя загруженной в текущий момент программы.

 

>Write $ZName // выводит «Rec112»
$ZNS[pace] $ZNSpace содержит имя текущей области.

 

>Write $ZNSpace // выводит «USER»
$ZP[arent] $ZParent содержит идентификатор процесса, который создал текущий процесс с помощью команды Job. Если он создавался не с использованием команды Job, значение равно 0.
     

 

>Write $ZParent // выводит «0»
$ZPI Содержит математическую константу Pi = 3.141592653589...

 

>Write $ZPI «3.141592653589793238»
$ZR[eference] $ZReference возвращает полную ссылку на только что использованную глобальную переменную.
     

 

>Set ^G(1) = "Hello" >Write $ZReference // выводит «^G(1)»
$ZS[torage] $ZStorage содержит (или устанавливает) размер рабочей памяти (в KB), который имеется или должен иметься в распоряжении процесса Cache.
     

 

>Write $ZStorage // выводит «24»
$ZtimeStamp $ZTS $ZtimeStamp, также как и $Horolog, содержит счетчик дней и секунд, последний с сотыми долями секунд.
     

 

>Write SZTS // выводит «57500,11608.52»
$ZTimeZone $ZTZ $ZTimeZone содержит число минут смещения времени для данного часового пояса относительно Гринвича. Если произвести изменение значения $ZTimeZone, то значение $Horolog тоже изменится и будет соответствовать данному часовому поясу.
     

 

>Write $ZTZ // выводит «300»
$ZV[ersion] $ZVersion содержит номер версии используемой в текущий момент времени системы Cache.
     

 

>Write $ZVersion // выводит «Cache for Windows NT (Intel) 5.0»

Операторы и выражения

COS поддерживает следующие группы операторов:

- Унарные арифметические и логические операторы;

- Бинарные арифметические операторы;

- Логические операторы;

- Операторы работы со сроками.

К унарным арифметическим операторам относятся «+» и «-», которые обеспечивают числовую интерпретацию операнда, например, «+123» и «-123».

Унарный положительный оператор не влияет на значение выражения, то есть не меняет знак.

Например,

Set x = -23

Write "x:" x,! // -23

Write "+ x:" + x,! // -23

 

В Caché также существует унарный логический оператор «'»

К бинарным арифметическим операторам относят:

«+» - Добавление;

«-» - Вычитание;

"*" - Умножение;

"/" - Деление;

"\" - Целочисленное деление;

"#" - остаток от деления;

«**» - Степень числа.

Пусть а = 5, b = 7, с = 10.

Выражение Значение
а + b  
а * b – с  
с / а  
2 + а * b  
2 + (а * b)  
3700 # 3600  
с # а  
9.123 \ 1  
3700 \ 3600  
2 ** 5  
9 **.5  
16 **.25  
4 ** (-2) .0625

К логическим операторам относят:

«=» - Проверка на равенство;

«'=» - Проверка на неравенство;

Если нужно провести проверку на числовую (не) равенство, то сначала нужно интерпретировать это выражение в число, например, используя знак «+».

Пусть у = 12, z = 15:

Выражение Значение
y < z  
z > "16abc"  

 

«[» - Содержит, оператор определяет, содержится ли правое выражение в левом;

" '[" - не содержится;

«]» - Следует за, оператор определяет, следует ли левый операнд за правым в лексикографической последовательности;

«']» - Не следует за;

«]]» - Сортируется за, оператор определяет, сортируется ли левый операнд по правому в лексикографической последовательности (нулевая строка идет первой, затем числа по порядку с отрицательных, пустой текст, положительные числа, в конце нечисловые значения);

«']]» - Не сортируется за;

«>» - Более чем;

«'>» - Не более чем;

«<» - Менее чем;

«'<» - Не менее;

«&» - Логическое И;

«» - Логическое ИЛИ;

«&&» - Логическое И;

«||» - Логическое ИЛИ;

Последние два оператора отличаются от предыдущей пары тем, что оба пропускают расчет правого операнда, если расчет левого уже дает конечный результат.

Например, когда вычисления левого операнда возвращает False в операции I или True в операции ИЛИ.

Например, пусть х ­= 3, у ­= "А", z =­ "3.0".

 

Выражение Значение
х = "а" 0 (False)
x=z 0 (False)
"АВС"[у 1 (True)
x]y 0 (False)
z] (x = у) 1 (True)
2]]19 0 (False)

К операторам работы со сроками относят:

_ - Конкатенация срок;

? - Сравнение с шаблоном.

Пусть х = "12".

Выражение Значение
"АВ" _ "CD" ABCD
"АВ" _ х АВ12
х_"А"[2  

Примечание 1. Последовательность выполнения операторов в COS всегда слева направо; в пределах выражения операции производятся в той последовательности, в которой они записаны. Для того, чтобы изменить порядок выполнения операций нужно использовать скобки.

Например,

Set TorF = ((4 + 7)> (6 + 6)) // False (0)

Set Value = (4 + 7 > 6 + 6) // 7

Примечание 2. В случае, когда строка используется как арифметическое выражение, она интерпретируется как число. Числовое значение получается с помощью сканирования сроки слева направо в поиске цифр, которые формируют числовой литерал. Сканирование продолжается пока не будет достигнуто первого нецифровой символа. Полученные знаки интерпретируются как число, значение которого используется в выражении. Если в начале сроки не стоят цифры, то числовое значение сроки = 0.

Например:

Set x1 = "3 blind mice" //3

Set x2 = "3.14 roughly equals Pi." //3.14

Set x3 = "4e2 is four-hundred." //400

Set x4 = "-4.2e2 is negative 420." //-420

Set x5 = "22 East 3rd Street" //22

Set x6 = "22E3St." //22000

Set x7 = "To be or not to be" //0

Write "4 Motorcycles" + "5 bicycles" // 9

Write -"2Cats"_"Rats" // -2Rats

Оператор проверки по шаблону

Символ оператора проверки по шаблону — это вопросительный знак.

Левый операнд — это строка символов, подлежащая исследованию.

Правый операнд — это так называемый «шаблон», состоящий из числа и одного или нескольких символов класса.

Результатом проверки по шаблону является ИСТИНА, если операнд точно соответствует образцу, в противном случае — 0. В качестве вводного примера приведем число 348, состоящее из 3 цифр. Тогда результатом проверки по шаблону «348? 3N» (348 соответствует образцу «три цифры») будет ИСТИНА.

Основу проверки по шаблону составляет лежащий в основе Cache набор символов, подразделяемый на отдельные классы символов. Cache поддерживает целый ряд различных (а благодаря наличию утилиты поддержки национальных языков cnls.exe также и национальных) наборов символов. Основной принцип проверки по шаблону легко объясним на примере 7-битного набора символов ASCII, причем при распространении на другие классы символов необходимо всегда задаваться вопросом, какому классу символов принадлежит заданный символ.

При этом класс управляющих символов определяется как класс, состоящий из символов ASCII с кодами 0-31, а также 127. Точно также выделяются знаки препинания, цифры и алфавитные символы. Каждый из этих классов получает краткое наименование.

Таблица 2. Классы символов и их значение при проверке по шаблону.

Класс символов Наименование Коды ASCII Пример
С Управляющие символы 0-31, 127 $с(7) - Веер
P Знаки препинания 32-47 !, $, %, &, /
N Цифры 48-57  
U Прописные буквы 65-90 A-Z
L Строчные буквы 92-122 a-z
А Алфавитные символы 65-90, 92-122 A-Z, a-z
Е Все символы 0-127  

Две последние группы не являются собственными классами символов, а объединяют другие классы. При проверке по шаблону определяется, в какой класс символов попадает каждый символ строки символов. Шаблон при этом построен по простому принципу: он состоит из последовательности элементов шаблона, соединенных друг с другом без знаков переноса. Каждый из элементов шаблона состоит из части, задающей фактор повторения, и части, указывающей, с каким классом символов производится сравнение.

В качестве примера приведем дату в форме дд.мм.гггг (скажем, 29.11.1999), находящуюся в переменной date. Следующая строка кода может служить проверкой ввода даты:

If date? 2N1P2N1P4N Write "Ввод даты верный "

При этом проверяется соответствие содержимое переменной date шаблону 2N1P2N1P4N. Последний состоит из 5 элементов шаблона, а именно, 2N, 1P, 2N, 1P, 4N. Каждый из элементов шаблона состоит из фактора повторения и класса символов. Элементу шаблона 2N соответствуют ровно две идущих друг за другом цифры, в то время как 1P определяет ровно один знак препинания. Результатом проверки по шаблону является логическое значение, всегда равное 1, если переменная соответствует шаблону, и 0, если это не так.

Введенная дата 310.5.1999 признается в данном случае неверной, так как эта строка символов начинается 3 цифрами, таким образом, третий символ не является знаком препинания, как того требует шаблон.

Вместо общепризнанных знаков препинания может быть точно задан конкретный символ, который необходимо иметь в дате. Чтобы, например, в определенном месте была именно точка, достаточен элемент шаблона 1".", и шаблон для даты можно сформулировать точнее: 2N1"."2N1"."4N.

Кроме того, существует возможность задавать минимально и/или максимально возможное число символов класса. Таблица 3 содержит все допустимые форматы.

Таблица 3. Форматы факторов повторения.

Фактор повторения Значение
<Number> Шаблон должен появляться точно <Number> раз.
<Number1>.<Number2> Шаблон должен встречаться как минимум <Number1> раз, однако не более чем <Number2> раз.
<Number>. Шаблон должен появляться как минимум <Number> раз.
. <Number> Шаблон может появляться самое большее <Number> раз.
. Шаблон может появляться сколь угодно часто (или же совсем не появляться).

Вместо того чтобы проверять, соответствует ли строка символов шаблону, часто совершают обратное: смотрят, имеется ли несоответствие строки символов заданному шаблону. Тогда можно вывести сообщение об ошибке и вновь потребовать ввода этой строки символов.

Следующие примеры показывают типичные случаи применения проверки по шаблону:

  • Строка символов, начинающаяся с прописной буквы, далее на выбор буквы или знаки препинания:
1U.AP
  • Номер транспортного средства, напр. DA-DM 733:
1.3U1"-"1.2U1" "1.4N
  • Наличие управляющего символа в строке символов:
.Е1С.Е

Наконец, в виде примера введем уточнение, а именно концепцию альтернативного шаблона. При этом в скобках с разделением запятой задаются альтернативные формы шаблонов, которые следует использовать.

Данная форма применения проверки по шаблону может быть с успехом продемонстрирована на примере проверки даты, если следующие форматы даты рассматриваются как допустимые:

  • Разделителем является точка: 29.11.1999
  • Разделителем является косая черта: 29/11/1999
  • Разделителем является дефис: 29-11-1999

При этом смешанная форма записи, а также другие разделители не разрешены. Нетрудно заметить, что первые две и последние четыре цифры одинаковы, а между ними находится альтернативная часть. Следовательно, для этого шаблона записывают:

1.2N1(1"."1.2N1".",1"/"1.2N1"/",1"-"1.2N1"-")4N

При этом идущие друг за другом в скобках шаблоны соответствуют ситуации ИЛИ: должен задаваться либо первый, либо второй, либо третий шаблон. С другими подробностями этого весьма эффективного варианта проверки по шаблону можно ознакомиться в документации по Cache.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-13 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: