Строки
В QSP есть три типа данных: числовой, строковый и кортежи. В данном разделе мы рассмотрим строковый тип данных и способы работы с ним.
Если мы присваиваем строковое значение переменной, перед именем такой переменной обязательно нужно ставить символ $. То же самое, если мы извлекаем строковое значение из переменной.
$text = "Зелёное яблоко" &! помещаем строковое значение в переменную
*pl $text &! выводим на экран значение строковой переменной
Также рекомендуется к названиям всех функций, возвращающих строковые значения, приписывать символ $ для улучшения читаемости кода.
$max('Петя','Вася','Лёша','Дима')
$text = $str(453+111)
$name = $input('Введите имя:')
Константы
Под константой следует понимать одно конкретное значение. Например, число 1441 — это числовая константа, а строка "Зелёные яблоки" — это строковая константа.
Если с числовыми константами в QSP всё просто (записываем число, используя набор цифр; например, 4953), то со строковыми есть несколько нюансов:
-
Строковая константа берётся с двух сторон в кавычки (обрамляется кавычками).
-
Кавычки могут быть двух видов: апострофы
' 'и прямые кавычки" ". -
Если нужно в константу включить кавычки того же вида, нужно написать их два раза подряд (экранировать через дублирование):
*PL 'Byte Soft''s "QSP"'*PL "Byte Soft's ""QSP"""!Byte Soft's "QSP"
-
-
В строковых константах сохраняются переносы строк и отступы:
'Данный текстбудет расположен нанескольких строках'$a='И этоттексттакже'a=2 & act 'Многострочноеназвание': gt 'next' -
Если ошибка допущена внутри строковой константы, то вся многострочная константа будет считаться одной строкой при выводе ошибки.
! ошибка указывается во второй строке*pl "Хотя на самомделе ошибкав четвёртой <<"строке">>" -
Текстовые константы и значения переменных можно объединять двумя способами:
-
С помощью оператора конкатенации
&. Выражение нужно брать в скобки, т.к. существует ещё разделитель команд&:! В переменную $res запишется 'x=5 y=6':$res = ('x=' & x & ' y=' & y)! В переменную $res запишется 'x=',! а '5' выведется в основное окно описания:$res = 'x=' & x -
С помощью оператора сложения
+:! Результат 'x=5 y=6':$res = 'x=' + x + ' y=' + y-
Следует соблюдать осторожность, если одно из слагаемых числового типа:
x = 1$res = '1' + x!Результат '2' вместо '11'
-
-
Экранирование
Чуть выше были приведены два случая экранирования кавычек в строке. Экранирование становится особенно важным, когда мы имеем дело с более сложным вложением кавычек. Например, при работе с HTML-разметкой.
Для более полног о понимания того, как можно экранировать кавычки в QSP, рассмотрим гиперссылку, в которую встроен переход на локацию. Вот как эта ссылка будет выглядеть на экране при отключенном режиме распознавания HTML:
<a href="EXEC: goto 'Верстак' " class="plain">Верстак</a>
Если мы заключим нашу ссылку в одинарные кавычки, нам придётся экранировать одинарные кавычки внутри атрибута href:
*p '<a href="EXEC: goto ''Верстак'' " class="plain">Верстак</a>'
Если мы заключим нашу ссылку в двойные кавычки, то нам придётся экранировать непосредственно границы атрибутов от кода QSP:
*p "<a href=""EXEC: goto 'Верстак' "" class=""plain"">Верстак</a>"
Есть способ записи, когда нам не приходится экранировать кавычки вообще. Мы просто заключаем ссылку в фигурные скобки (не рекомендуется):
*p {<a href="EXEC: goto 'Верстак' " class="plain">Верстак</a>}
Может так же пригодиться способ, позволяющий создавать глубокие уровни вложенности кавычек друг в друга и обходиться без экранирования:
*p '<a href="EXEC:' + " goto 'Верстак' " + ' " class="plain">Верстак</a>'
Сравнение строк
Точно так же, как и числовые значения, мы можем сравнивать строковые значения. При этом операции сравнения будут возвращать 1, если равенство верно, и 0, если равенство неверно.
if 'abc'='abc': 'Условие выполнено'
*pl ('abc'='abc') & ! увидим на экране единицу
*pl ('abc'>'ab') & ! увидим на экране единицу
*pl ('abc'<'abc') & ! увидим на экране ноль
Строки сравниваются посимвольно, начиная с крайнего левого символа.
! это не валидный код qsp
! а табличка сравнения строковых констант
'ac' = 'ac'
'bc' > 'ac' &! 'b' > 'a'
'ac' > 'ab' &! 'c' > 'b'
'b' > 'ab' &! 'b' > 'a'
'ab' > 'a' &! 'b' > ''
Если строки сравниваются с числами, плеер пытается привести строку к числу и затем сравнить два числа. Если привести строку к числу не получается, плеер приводит число к строке и сравнивает две строки. Поэтому результаты могут отличаться в разных случаях:
! это не валидный код QSP
! а табличка сравнения
3 < '12' &! '12' приводится к числу, и 12 > 3
'3' > '12' &! сравниваются две строки, а '3' > '1'
3 > '12a' &! '12a' не приводится к числу, сравниваются строки
Подвыражения
QSP позволяет вставлять значения различных выражений в строковые константы, а так же в базовые описания локаций и названия базовых действий. Для этого используются специальные конструкции из двойных угловых скобок: << и >>. Выражения, помещённые в такие двойные угловые скобки, называются подвыражениями, или вложенными выражениями.
Примеры:
число_гоблинов=5
'Тебя окружили <<число_гоблинов>> гоблинов!'
! на экране будет строка:
! Тебя окружили 5 гоблинов!
pl 'Вас зовут <<$playerName>>, вы находитесь в <<$curloc>>.'
Когда плеер встречает подобное подвыражение, он это подвыражение раскрывает. Это значит, что плеер вычисляет значение выражения в двойных угловых скобках, а затем подставляет полученное значение на место этого самого подвыражения.
Другие примеры:
pl 'i='+$str(i)
!эквивалентно
pl 'i=<<i>>'
Подвыражения можно вкладывать друг в друга. Здесь очень важно соблюдать чередование кавычек, если вы это делаете:
!Вложенные подвыражения:
pl val('<<val("<<i>>")>><<j>>')
pl val('<<$str(val("<<i>>"))>>')
! Здесь в подвыражения вкладываются другие
! строковые константы с подвыражениями
Если нужно последовательность << вывести на экран, или поместить в переменную, можно воспользоваться одним из этих способов:
-
Разбить
<<на'<'+'<':$text = '<'+'<var>>''string <'+'<var>>' -
Использовать фигурные скобки:
$text={<<var>>}*pl {string <<var>>}
Фигурные скобки — это ещё один способ создавать строковые константы. При их использовании создаются точно такие же строковые константы, как и в случае с обычными кавычками, однако в таких константах не раскрываются подвыражения. К тому же текст, размещённый в фигурных скобках не подсвечивается непосредственно как текст различными редакторами (например, Quest Generator), а подсвечивается как обычный код. Поэтому фигурные скобки обычно используют для создания динамического кода.
*pl {
Это текст в фигурных скобках,
здесь не раскрываются <<подвыражения>>
}
dynamic {
! обычно в фигурных
! скобках размещают
*pl "Код для оператора DYNAMIC"
}
Функции
-
LEN([$стр])- возвращает длину строки[$стр].*pl len('Зелёные яблоки') &! на экране будет число 14 -
$MID([$стр],[#начало],[#длина])- вырезает из строки[$стр]строку, которая начинается с символа номер[#начало]и имеет длину[#длина]. Нумерация символов в строке ведётся с 1.-
Параметр
[#длина]может отсутствовать, при этом вырезается вся строка, начиная с символа[#начало]. -
Если
[#начало]превышает длину строки, функция возвращает пустую строку. -
Примеры:
$MID('abcd', 1, 2) &! 'ab'$MID('abcd', 2, 3) &! 'bcd'$MID('abcd', 2) &! 'bcd'$mid('abcd',5) &! '' (пустая строка)
-
-
$UCASE([$стр])- возвращает строку больших букв, полученную изменением регистра букв исходной строки[$стр].$UCASE('TexT#') &! 'TEXT#' -
$LCASE([$стр])- возвращает строку маленьких букв, полученную изменением регистра букв исходной строки[$стр].$LCASE('TExT#') &! 'text#' -
$TRIM([$стр])- удаляет прилегающие пробелы и символы табуляции из[$стр]и возвращает полученную строку.$TRIM(' TRIM TEST ') &! 'TRIM TEST' -
$REPLACE([$стр],[$поиск],[$замена],[#количество_замен])- заменяет в строке[$стр]несколько вхождений строки[$поиск]строкой[$замена]. Замена производится слева-направо и только для неперескающихся вхождений.-
Параметр
[#количество_замен]показывает, сколько вхождений должно быть заменено. Если параметр не указан, производится замена всех вхождений. -
Параметр
[$замена]может отсутствовать, тогда он принимается равным пустой строке. -
Примеры:
$REPLACE('test', '12', '4') &! 'test'$REPLACE('test', 'e', 's') &! 'tsst'$REPLACE('test', 't', '34') &! '34es34'$REPLACE('test', 't') &! 'es'$REPLACE('test', 't', 'qu', 1) &! 'quest'$REPLACE('test my test', 't', 'q', 3) &! 'qesq my qest'
-
-
INSTR([$строка],[$поиск],[#начало])- возвращает номер позиции символа, с которого начинается вхождение строки[$поиск]в строку[$строка](или 0, если вхождения нет). Поиск начинается с символа номер[#начало].- Параметр
[#начало]может отсутствовать, при этом он принимается равным 1. - Примеры:
- Параметр
INSTR('ABCDefgh','BC',1) &! 2
INSTR('ABCDefgh','Be',1) &! 0
INSTR('abcdef','abc') &! 1
-
ISNUM([$строка])- функция проверяет, является ли строка[$строка]числом. Функция возвращает0(ложь) или1(истина).ISNUM(' 9999 ') &! 1ISNUM(' -888') &! 1ISNUM('777a6') &! 0ISNUM('')&! 0, т.к. пустая строка не содержит числа -
VAL([$стр])- переводит строку цифр[$стр]в соответствующее число. При ошибке возвращает0.яблоки = VAL($яблоки)val('123') & ! увидим 123val('') & ! увидим 0val('sand') & ! увидим 0 -
$STR([#число])- переводит число (числовое выражение) в соответствующую строку.PL $STR(56)
Операторы
SCANSTR [$имя_массива], [$текст_для_разбора], [$регэксп], [#номер_группы]— оператор ищет в строке[$текст_для_разбора]непересекающиеся фрагменты, соответствующие регулярному выражению[$регэксп], и помещает их в массив[$имя_массива]. Если параметр[#номер_группы]указан и отличается от нуля, в массив помещается не весь фрагмент целиком, а лишь та его часть, которая соответствует группе с указанным номером.- Подробное описание оператора и примеры использования в разделе "массивы".