Значение переменной как список значений
Для получения элемента списка (или элементов) предназначена функция member
. Элементы нумеруются с нуля. Можно также отсчитывать элементы списка с конца, для этого используются отрицательные числа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
LIST = 01 02 03 04 05 06 07 08 09 ### первый элемент message($$member(LIST)) # 01 message($$member(LIST, 0)) # 01 message($$first(LIST)) # 01 ### последний элемент # отрицательные числа означают отсчет с конца списка message($$member(LIST, -1)) #09 message($$last(LIST)) # 09 ### элементы из середины списка # один элемент по номеру message($$member(LIST, 3)) # 04 # диапазон элементов, с первого по последний индекс включительно message($$member(LIST, 3, 4)) # 04 05 # если второй индекс меньше первого, то элементы будут выбраны в обратном порядке message($$member(LIST, 3, 1)) # 04 03 02 # диапазон элементов с отсчетом от конца message($$member(LIST, -1, -3)) # 09 08 07 # обратный порядок, если идти от конца message($$member(LIST, -4, -3)) # 06 07 |
Для того, чтобы разбить строку на части (и превратить ее в список значений), используйте функцию split
. Для обратной операции используйте join
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
VAR = 1,2,3,4,5,6 7,8, 9 # разделение в список по разделителю LIST = $$split(VAR,',') message($$LIST) # 1 2 3 4 5 6 7 8 9 # объединение без разделителя VAR = $$join(LIST) message($$VAR) # 123456789 # объединение с разделителем VAR = $$join(LIST, |) message($$VAR) # 1|2|3|4|5|6|7|8|9 # объединение с разделителем и обрамлением VAR = $$join(LIST, |, <, >) message($$VAR) # <1|2|3|4|5|6|7|8|9> |
Удаления дублирующихся значений:
1 2 3 4 |
LIST = 1 2 2 2 3 message($$unique(LIST)) # 1 2 3 |
Изменение порядка значений:
1 2 3 4 |
LIST = 1 2 3 4 5 message($$reverse(LIST)) # 5 4 3 2 1 |
Количество значений в переменной можно узнать с помощью функции size
. Если нужно не столько количество узнать, сколько проверить, правильное ли количество значений в переменной, то удобнее будет использовать условную функцию count
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
LIST = a b c d e message($$size(LIST)) # 5 # вернет истину, если в переменной есть ровно указанное количество значений count(LIST, 5): message(OK"," there is 5 values exactly) # count может проверять количество значений не только на равенство # третьим аргументом можно передать предикат # допустимые предикаты: >, >=, <, <=, =, ===, greaterThan, lessThan, equals, isEqual # вернет истину, если значений больше трех count(LIST, 3, >): message(OK"," there is more than 3 values) |
Значение переменной целиком
Пожалуй, самые часто используемые функции — это проверка на равенство и на пустоту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
A = abc # проверка того, что переменная (первый параметр) # равна некоторому значению (второй параметр) isEqual(A, abc) { # если A == abc } else { # если A != abc } # то же самое equals(A, abc): message(A == abc) # проверка на пустое значение !isEmpty(A): message(A is not empty!) |
Если переменная содержит одно значение, которое можно преобразовать в целое или вещественное число, то его можно сравнить с другим числовым значением:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
VAR = 10 greaterThan(VAR, 9): message(VAR > 9) lessThan(VAR, 20): message(VAR < 20) # Если переменная содержит нечисловое значение или # сравнивается с нечисловым значением, то происходит сравнение строк VAR = abc greaterThan(VAR, aaa): message(VAR > aaa) lessThan(VAR, bbb): message(VAR < bbb) # Если нужно всегда делать построчное сравнение, то благоразумно будет # защититься от того что, значения будут интерпретированы как числа VAR = 100 VAR_ = x100 greaterThan(VAR_, x200): message(success!) # вместо greaterThan(VAR, 200) |
Числа можно облагородить с помощью функции format_number
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# можно указать ширину, лишнее заполняется пробелами message(|$$format_number(12, width=5)) # | 12 # или нулями message($$format_number(12, width=5 zeropad)) # 00012 # пробел для знака, чтобы красиво смотрелось # рядом с отрицательными числами message(|$$format_number(12, width=5 zeropad padsign)) # | 0012 message(|$$format_number(-12, width=5 zeropad padsign)) # |-0012 # или можно всегда выводить знак message(|$$format_number(12, width=5 zeropad alwayssign)) # |+0012 # выравнимвание по левой стороне поля # с zeropad не работает message($$format_number(12, width=5 leftalign)|) # 12 | message($$format_number(12, width=5 leftalign zeropad)|) # 12 | # можно указать систему счисления для параметра # по умолчанию равно 10 message($$format_number(12, ibase=16)) # 18 # и для результата можно указать систему счисления # тоже 10 по умолчанию message($$format_number(12, ibase=16 obase=2)) # 10010 |
Преобразование регистра. Только для ASCII!
1 2 3 4 |
message($$lower(AAA)) # aaa message($$upper(aaa)) # AAA |
Поиск по подстроке или регулярному выражению:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
VAR = one two two three four # поиск значений по подстроке message($$find(VAR, four)) # four # именно что по подстроке, не точное равенство message($$find(VAR, fo)) # four # если значения дублируются, то и в результате они дублируются message($$find(VAR, two)) # two two # поиск с помощью регулярного выражения message($$find(VAR, t.*e)) # three |
Если нужно просто проверить, есть ли некоторое значение в переменной, то вместо find
будет удобнее воспользоваться contains
, которая работает подобно функции CONFIG
.
1 2 3 4 5 6 7 8 9 10 11 12 |
VAR = abc def # поиск присходит по полному совпадению contains(VAR, abc): message(abc is found!) !contains(VAR, ab): message(ab is not found!) # можно использовать регулярные выражения contains(VAR, ab.*): message(ab.* is found!) # подобно CONFIG, можно искать взаимоисключающие значения contains(VAR, def, abc|def): message(def is active.) |
Замена по подстроке или регулярному выражению:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
VAR = one two two three four # замена по значению message($$replace(VAR, one, ABC)) # ABC two two three four # в отличие от ~=, меняются все вхождения message($$replace(VAR, two, ABC)) # one ABC ABC three four # как и в find, поиск происходит по подстроке, # а не по точному равенству message($$replace(VAR, tw, ABC)) # one ABCo ABCo three four # замена с помощью регулярного выражения message($$replace(VAR, t.*, ABC)) # one ABC ABC ABC four |
Функция sprintf
заменяет в первом параметры %1-%9 на значения следующих параметров:
1 2 3 4 |
A = $$sprintf(%1 percent of the %2 is done, 10, work) message($$A) # 10 percent of the work is done |
Функция re_escape
эскейпит все специальные символы в регулярном выражении. Похожий эффект имеет функция val_escape, которая эскепит значение таким образом, что если полученное значение потом обработать по правилам парсера qmake, то получится исходное выражение.
1 2 3 4 5 6 7 8 9 10 11 12 |
message(^4\\.[0-6]\\..*) # ^4\.[0-6]\..* message($$re_escape(^4\\.[0-6]\\..*)) # \^4\\\.\[0-6\]\\\.\.\* message($$re_escape(^4\.[0-6]\..*)) # \^4\\\.\[0-6\]\\\.\.\* # val_escape требует переменную var = \sdf "'" ^4\.[0-6]\..* var2 = $$val_escape(var) message($$var2) # \\sdf \' ^4\\.[0-6]\\..* eval(var3 = $$var2) message($$var3) # \sdf ' ^4\.[0-6]\..* |
В некоторых случаях незаменимая функция escape_expand
позволяет вставить в значение переменной символы \n, \t и \r, которые другим способом никак указать нельзя:
1 2 3 |
A = line 1$$escape_expand(\n)line 2 # значение содержит 2 строки, а не одну. |
Функция section
— это что-то вроде объединения функция split
и member
. Первый параметр — имя переменной, второй — разделитель, третий и (опционально) четвертый — номера «элементов». Нумерация может идти с конца с помощью отрицательных чисел.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
LIST = 01/02/03/04/05/06/07/08/09 # первый элемент message($$section(LIST, /, 0, 0)) # 01 # последний элемент message($$section(LIST, / , -1)) # 09 # один элемент из середины по номеру message($$section(LIST, / , 3, 3)) # 04 # второй праметр по умолчанию равен -1 message($$section(LIST, / , 3)) # 04/05/06/07/08/09 # диапазон элементов, с первого по последний индекс включительно message($$section(LIST, / , 3, 4)) # 04/05 # если второй индекс левее первого, то результат будет пустым message($$section(LIST, / , 3, 1)) # пусто! message($$section(LIST, / , -1, -3)) # пусто! message($$section(LIST, / , -4, -3)) # 06/07 |