Кубанский государственный университет
Опубликован: 24.12.2013 | Доступ: свободный | Студентов: 681 / 8 | Длительность: 24:28:00
Лекция 3:

Иерархические модели данных. Деревья в СУБД Cache

3.2.5 Строки

Мы уже встречались со строковыми константами, представляющими последовательность символов, заключенных в двойные кавычки. Набор используемых символов зависит от сделанного при установке Cache выбора кодировки (Unicode или UTF8). Длина строки не превышает 32 К символов.

Поскольку двойная кавычка ограничивает строковую константу возникает вопрос, что делать, если символ " встречается внутри текста? В этом случае её просто удваивают:

USER>W "a""b" 
a"b

Длина пустой строки —ноль. В команде READ вводимой переменной присваивается пустая строка каждый раз, когда ввод состоит из единственного нажатия клавиши Enter.

В стандартном ASCII-терминале длина строки 80 символов. При выводе длинная строка разрезается. При вводе необходимо продолжать набор символов, не обращая внимание на самопроизвольный переход маркера на следующую строку (рисунок 3.17).

 Очень длинная строка

Рис. 3.17. Очень длинная строка

При выборе UTF8 допускается использование символов кириллицы и псевдографики, занимающих вторую половину кодовой таблицы ASCI ОТ 128 до 255).

Над строками определены пять бинарных операций:

  • равенство (=),
  • соединение строк (конкатенация), обозначаемое знаком подчеркивания (_),
  • проверка соответствия шаблону, обозначаемая знаком вопроса (?),
  • операция "содержит", обозначаемая [, и определяющая, содержится ли второй операнд в первом,
  • операция "следует за", обозначаемая ], и определяющая, следует ли первый операнд за вторым в лексикографической последовательности,
  • операция "сортируется за" ]].

Конкатенация соединяет оба операнда в одну строку, записывая операнды последовательно слева направо (листинг 3.14).

USER>W 
"conca"_"te"_"nation" concatenation

Пример 3.14. Конкатенация

Рассмотрим операторы строкового сравнения =, [ , ] и ]] . Оператор = проверяет строки на идентичность.

Оператор "содержит" обозначается символом "[ " и возвращает логическое значение. Запись s[t означает проверку того, что строка t входит в строку s хотя бы один раз (листинг 3.15):

USER>S x= "abcd"["bc" W x 
1
USER>S x= "abcd"["aa" W x 
0

Пример 3.15. Вхождение строки

Операторы следования и сортировки могут показаться мелочно сложными, не интересными, а может быть и не нужными. Тем не менее, рассмотрите их внимательно и во всех деталях, чтобы понять как Cache упорядочивает узлы дерева одного уровня.

Оператор "следует за" обозначается как закрывающая прямая скобка "] ". Строка s следует за t, то есть выражение t]s истинно, если выполняется одно из трех условий:

  • строка t непустая, а s пустая, то есть пустая строка следует за любой непустой (листинг 3.16):

    USER>S x="abc"]"" W x 
    1
    
    Пример 3.16.
  • строки s и t непустые и код ASCII первого символа t превышает код ASCII первого символа строки s (листинг 3.17):

    USER>S x="cd"]"axz" W x 
    1
    USER>S x="cd"]"exz" W x 
    0
    
    Пример 3.17.
  • начала строк совпадают, но для оставшихся частей выполняется одно из двух предыдущих условий (листинг 3.18):

    USER>S x="aacd"]"aabxz" W x 
    1
    USER>S x="aacd"]"aa" W x 
    1
    
    Пример 3.18.

Оператор "сортируется за", обозначается ]] . В предыдущем операторе "следует за" оказывается, что вопреки здравому смыслу, но в соответствии с правилами лексикографического упорядочения число 10 предшествует 9 потому, что код первого символа "1" меньше кода "9". Так командная строка S x="10"]"9"W x отрицает, что 10 следует за 9. Оператор ]] устраняет этот недостаток. Проверим:

USER>S x="10"]]"9" W x 
1

В самом деле, число 10 больше 9, то есть следует за 9.

Поскольку все типы данных, за исключением больших, записываются строками, необходимо интерпретировать строку в соответствие с ее типом. Важно помнить правило числовой интерпретации строки: "Строка в арифметическом выражении читается слева направо и понимается как число до тех пор, пока встречаются символы цифр (0,. . . ,9), буквы "E" или "e" между двумя цифрами, понимаемые как разделитель мантиссы и порядка в экспоненциальной форме записи числа". На первом символе не входящем в указанный набор числовая интерпретация прекращается. Если строку не удается интерпретировать как число, ей присваивается значение ноль (листинг 3.19).

USER>S x="5 apples"+"7 books" W x 
12
USER>S x=+"abc" W x 
0
USER>S x=-".7e2cccw"    W x 
-70
USER>S x=".7e2cccw"    W x 
.7e2cccw
Пример 3.19. Интерпретация строки

Работая со строками, нужно уметь определить длину строки (это делает функция $LENGTH), выделить фрагмент строки (функция $EXTRACT), проверить вхождение подстроки в строку (функция $FIND или оператор "[" ). Может потребоваться замена одних символов другими (функция $TRANSLATE).

Функция $L[ENGTH] возвращает длину строки символов. При работе с простыми строками без разделителей используется одноаргументая форма функции (листинг 3.20):

USER>W $L("12345678")
8
USER>W $L("") 
0
Пример 3.20. Одноаргументая форма функции

Функция $E[XTRACT] выделяет из указанной строки подстроку. Второй аргумент указывает начальную позицию, с которой вырезается подстрока, а третий аргумент — конечную позицию (листинг 3.21):

USER>W $E("12345678",3,5)
345
USER>W $E("Those evening bell",7,13) 
evening
Пример 3.21. Выделение подстроки

Второй и третий аргументы, если они имеются, интерпретируются как целые числа.

USER>W $E("Those evening bell",7.9,12.9) 
evenin

Если значение второго аргумента, определяющее первую позицию меньше нуля, то выделение начинается с первой позиции строки:

Если третий аргумент превышает длину исходной строки, строка выделяется до конца. Этим пользуются для задания условия "до конца строки". Достаточно в третьем аргументе указать число, превышающее максимально допустимую длину строки.

USER>W $E("Those evening bell",15,9999)}
bell

Если позиция начала подстроки больше позиции ее конца, скажем $E("12345678",10,5), то функция возвращает пустую строку. Пустая строка выделяется и тогда, когда начальная позиция подстроки больше длины исходной строки.

Функция $F[IND] определяет, встречается ли строка заданная ее вторым аргументом в строке заданной первым аргументом. Если подстрока не найдена, то возвращается ноль:

USER>W $F("12345678","x")
0

Если подстрока найдена, возвращается номер позиции следующей за концом найденной подстроки:

USER>W $F("12345678","45")
6

Полезно понять, зачем выдаётся именно эта позиция.

В трехаргументной форме функции $FIND третий аргумент задает номер символа исходной строки, с которого начинается поиск. Поскольку время поиска, пропорционально числу проанализированных символов, задание третьего аргумента может существенно уменьшить время поиска:

USER>W $F("12345678","8",7)
9

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

В соответствии с классической теорией множеств в Cache ObjectScript пустая строка содержится в любой строке, в том числе и в пустой:

USER>W $F("123","")
1
USER>W $F("","") 
1

Для поиска всех вхождений подстроки в строку необходимо использовать циклы (листинг 3.22).

USER>S p=1 F    {S p=$F("1111",   "1",p)  Q:p=0    W !,p}
2 
3 
4 
5
Пример 3.22.

Функция $TR[ANSLATE] используется с двумя аргументами

$TR[ANSLATE](выражение1, выражение2)

или тремя

$TR[ANSLATE]( выражение!,  выражение2, выражение3)

В двухаргументной форме из строки, определённой первым выражением удалятся все символы, имеющиеся в строке, определённой вторым выражением. Например:

USER>W $TR("стpокa","оa")
"стрк"

В трёхаргументной форме строки s2 и s3, определённые вторым и третьим выражениями, определяют таблицу трансляции. Символу в n-ой позиции строки s2 соответствует символ в n-ой позиции строки s3. Если длина s2 больше длины s3, то символы s2, у которых нет соответствия, будут удалены:

USER>W $TR("3TO e-mail",  "maile-", "мыло") 
Это мыло