--- parser3/operators.txt 2021/01/13 23:10:52 1.254 +++ parser3/operators.txt 2024/12/15 22:15:51 1.256 @@ -220,6 +220,7 @@ odbc c:\drives\y\parser3project\odbc\deb всегда есть кодировка UTF-8, она является кодировкой по-умолчанию для request и response ВНИМАНИЕ: имя кодировки case insensitive + синтаксис $имя[новое значение] $имя(математическое выражение нового значения) @@ -228,7 +229,7 @@ odbc c:\drives\y\parser3project\odbc\deb ^имя параметры вызов $имя.CLASS класс значения $имя.CLASS_NAME имя класса - $имя[$.key[] () {}] конструктор элемента переменной-хэша $имя.key + $имя[$.key[] () {}] конструктор элемента переменной-хеша $имя.key ^method[$.key[] () {}] конструктор элемента параметра-хеша $parameter.key $CLASS.имя обращение к переменной класса @@ -243,7 +244,7 @@ odbc c:\drives\y\parser3project\odbc\deb $переменная строка$переменная [код, вычисляющий строку] - например: $хэш[$.возраст(88)] $достать[$.поле[возраст]] ^хэш.[$достать.поле].format{%05d} + например: $хеш[$.возраст(88)] $достать[$.поле[возраст]] ^хеш.[$достать.поле].format{%05d} параметры := один или много параметров параметр := @@ -269,6 +270,7 @@ int,double ^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0} $.bind[см. table::sql]]] запрос, результат которого должен быть один столбец/одна строка + string в выражении def значение равно "не пуста?" @@ -307,11 +309,12 @@ string опции поиска+= g заменить все вхождения, а не одно - ^строка.split[разделитель|regex][[lrhv]][[название столбца для вертикального разбиения]] + ^строка.split[разделитель|regex][[lrhva]][[название столбца для вертикального разбиения]] l слева направо [default] r справа налево h nameless таблица с ключами 0, 1, 2, ... v таблица из 1 столбца 'piece' или как передадут [default] + a массив ^строка.{l|r}split[разделитель] таблица из столбца $piece оставлен для совместимости @@ -360,6 +363,7 @@ string ^string:unescape[js|uri;escaped; $.charset[] ] декодирование переданного из js или uri + table в выражении логическое значение равно "не пуста?" @@ -411,6 +415,10 @@ table если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом $.type[string/table] поменять значение элемента на строку (указать одну колонку) или таблицу ^таблица.columns[[название столбца]] + таблица из одного столбца 'column' или как передадут + ^таблица.cells[], ^таблица.cells(лимит) - выдает массив ячеек текущей строки + ^таблица.array[] - возвращает массив, элементами которого являются хеши, отображающие данные каждой строки + ^таблица.array[колонка] - возвращает массив значений указанной колонки + ^таблица.array{код} - возвращает массив результатов выполнения переданного кода для каждой строки таблицы ^таблица.rename[название столбца;новое навание столбца] - переименовывает столбец ^таблица.rename[ $.название столбца[новое навание столбца] ] - переименовывает столбцы $отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало @@ -433,24 +441,30 @@ hash ^хеш.sub[вычитаемое] ^хеш.union[b] = объединение одноимённые остаются - ^хеш.intersection[b] = пересечение - значения хеш + ^хеш.intersection[b][[$.order[self|arg]]] = пересечение + новый хеш, order задает порядок элементов (как в исходном хеше или хеше-параметре) ^хеш.intersects[b] = bool ^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) $.type[hash|string|table]]] получается hash(ключи=значения первая колонка ответа) of hash(ключи=названия остальных колонкок ответа) или - string=значение каждого элемента - строка, при надо указать ровно два столбца или + string=значение каждого элемента - строка, при этом надо указать ровно два столбца или table=значение каждого элемента - таблица ^хеш.keys[[название колонки с ключами]] + таблица из одного столбца key или как передадут ^хеш.count[] ^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] ^хеш.delete[ключ] удалить ключ ^хеш.contain[ключ] - существует ли в хеше ключ (bool) - ^хэш.at[first|last][[key|value|hash]] - ^хэш.at([-]N)[[key|value|hash]] + ^хеш.at[first|last][[key|value|hash]] + ^хеш.at([-]N)[[key|value|hash]] доступ к заданным элементам упорядоченного хеша - ^хэш.sort[key;value]{{ключеделатель строка}|(ключеделатель число)}[[desc|asc]] default=asc + ^хеш.set[first|last;значение] + ^хеш.set([-+]N)[значение] + устанавливает значение заданного элемента упорядоченного хеша + ^хеш.rename[старый_ключ;новый_ключ] + ^хеш.rename[ $.старый_ключ[новый_ключ] ... ] + переименовывает заданные ключи хеша + ^хеш.sort[key;value]{{ключеделатель строка}|(ключеделатель число)}[[desc|asc]] default=asc $обратный_хеш[^хеш.reverse[]] - $отобранное[^хэш.select[key;value](выражение)[ $.limit(N) $.reverse(bool) $.default(bool) ]]] = хэш из ключей и значений, для которых условие истинно + $отобранное[^хеш.select[key;value](выражение)[ $.limit(N) $.reverse(bool) $.default(bool) ]] = хеш из ключей и значений, для которых условие истинно hashfile ^hashfile::open[filename] @@ -479,24 +493,97 @@ hashfile $uid[$sessions.$sid] +array + в выражении + логическое значение равно "не пуст?" + числовое значение равно count[] + $массив.индекс, $массив.(выражение) + возврат значения по заданному индексу + $массив.индекс[значение], $массив.(выражение)[значение] + присваивание значения по индексу + $массив[значение;значение;...] + создание массива с заданными значениями + ^array::create[] + ^array::create[значение;значение;...] + создание массива с заданными значениями или пустого массива + ^array::copy[копируемый массив или хеш с цифровыми ключами] + копирование массива или хеша с цифровыми ключами + ^массив.add[добавляемый массив или хеш с цифровыми ключами] + добавление элементов из другого массива или хеша с перезаписью значений у совпадающих индексов + ^массив.join[добавляемый массив или произвольный хеш] + добавление элементов другого массива или хеша в конец массива + ^массив.append[значение;значение;...] + добавление элементов в конец массива + ^массив.insert(индекс)[значение;значение;...] + вставка элементов в указанную позицию массива + ^массив.left(n) + возвращает новый массив из n первых элементов массива + ^массив.right(n) + возвращает новый массив из n последних элементов массива + ^массив.mid(m;n) + возвращает новый массив, содержащий n инициализированных элементов массива, начиная с позиции m + ^массив.delete(index) + удаление элемента массива с оставлением пустого места + ^массив.remove(index) + удаление элемента со сдвигом последующих элементов на его место + ^массив.push[значение] + добавление элемента в конец массив + ^массив.pop[] + возвращает последний элемент и удаляет его из массива + ^массив.contain(индекс) + существует ли в массиве элемент по переданому индексу (bool) + ^array::sql{запрос}[[ $.sparse(false) $.distinct(false) $.limit(2) $.offset(4) $.type[hash|string|table]]] + создание массива на основе выборки из базы данных + $.sparse(false), по умолчанию - создать обычный массив. Значения строк выборки последовательно добавляются в массив + $.sparse(true) - создать разреженный массив. Первая колонка данных должна содержать индексы, + по которым будут размещены значения (аналогично ^hash::sql{}) + получается array of hash (ключи=названия остальных колонкок ответа) или + string=значение каждого элемента - строка, при этом надо указать ровно два столбца или + table=значение каждого элемента - таблица + ^массив.keys[[название колонки с ключами]] + таблица из одного столбца key или переданного названия с индексами инициализированных элементов массива + ^массив.count[] + количество инициализированных элементов массива + ^массив.count[all] + общее количество элементов массива, включая неинициализированные + ^массив.foreach[index;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] + перебирает все инициализированные элементы массива + ^массив.for[index;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] + перебирает все элементы массива + ^массив.at[first|last][[key|value|hash]] + ^массив.at([-]число)[[key|value|hash]] + доступ к элементу массива по порядковому номеру + ^массив.set[first|last][значение] + ^массив.set([-]число)[значение] + установка значения элемента массива по порядковому номеру + ^массив.compact[] + удаление неинициализированных элементов массива + ^массив.compact[undef] + удаление неинициализированных и пустых элементов массива + ^массив.sort[key;value]{{ключеделатель строка}|(ключеделатель число)}[[desc|asc]] default=asc + сортировка массива + $обратный_массив[^массив.reverse[]] + возвращает новый массив из элементов исходного в обратном порядке + $отобранное[^массив.select[key;value](выражение)[ $.limit(N) $.reverse(bool) ]] + отбор элементов массива, для которых условие истинно + form [берётся первый элемент из одноимённых из GET, потом первый из POST] $form:поле = string/file $form:nameless = поле со значением поля без имени "?value&...", "...&value&...", "...&value" $form:qtail = строка со значением текста после второго "?xxxxx", если там не было ',' [imap] $form:fields = hash со всеми полями формы + $form:elements.поле = array со всеми значениями поля - как строковыми, так и файловыми $form:tables.поле = table с одним столбцом "field" со значениями "поля", для множественных значений $form:files.поле = hash со значениями полей типа файл, ключи - 0, 1, ..., значение - файл - $form:imap = хэш с ключами 'x' и 'y' + $form:imap = хеш с ключами 'x' и 'y' со значением ?1,2 приписки при использовании server-site image map - env $env:переменная - $env:fields хэш с переменными окружения + $env:fields хеш с переменными окружения $env:PARSER_VERSION версия парсера - cookie $cookie:имя считать старое или свежезаданное $cookie:имя[значение] на 90 дней @@ -505,7 +592,6 @@ cookie если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" $cookie:fields = hash со всеми cookies - request $request:query $request:uri @@ -520,7 +606,7 @@ request $request:body тело POST-запроса в виде текста $request:body-file тело POST-запроса в виде файла $request:body-charset кодировка POST-запроса - $request:headers хэш с заголовками запроса (без префикса HTTP_) + $request:headers хеш с заголовками запроса (без префикса HTTP_) response @@ -557,7 +643,7 @@ regex $шаблон.options строка с исходным текстом опций -TODO: reflection +reflection ^reflection:create[класс;конструктор[;пара;[мет[;ры]]]] вызывает указанный конструктор класса (не более 100 параметров) ^reflection:classes[] хеш со всеми классами. ключ -- имя класса, значение бывает methoded (класс с методами) или void ^reflection:class[объект] класс переданного объекта @@ -565,6 +651,7 @@ TODO: reflection ^reflection:base[объект] родительский класс переданного объекта ^reflection:base_name[объект] имя родительского класса переданного объекта ^reflection:class_by_name[имя класса] получение класса по имени + ^reflection:class_alias[имя класса;новое имя класса] задает псевдоним для указанного класса ^reflection:def[class;имя класса] проверка класса на существование ^reflection:methods[класс] хеш со списком методов указанного класса, значения -- строки 'native' или 'parser' ^reflection:method[класс или объект;имя метода] возвращает junction-method класса или объекта @@ -713,6 +800,7 @@ mail под win32 используется SMTP протокол, сервер задаётся $MAIL.SMTP[smtp.domain.ru] + image $картинка[^image::measure[DATA[; $.exif(bool) $.xmp(bool) $.xmp-charset[] $.video(bool) ]]] смотрит на .ext case insensitive, @@ -785,10 +873,12 @@ file ^file::stat[имя файла] $файл_который_был_stated_или_loaded.size .adate .mdate .cdate ^file::cgi[[text|binary;]имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] + любой аргумент может быть строкой или массивом строк возвращённый заголовок рассыпается на $поля $status $stderr ^file::exec[[text|binary;]имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under unix max 50 args]]]]]]] + любой аргумент может быть строкой или массивом строк options: $.stdin[текст|файл] если пусто, отключается автоматическое пересовывание данных HTTP-POST ^file:move[старое имя файла;новое имя файла] @@ -840,8 +930,8 @@ math ^math:round floor ceiling ^math:trunc frac ^math:abs sign - ^math:exp log - ^math:sin asin cos acos tan atan + ^math:exp log log10 + ^math:sin asin cos acos tan atan atan2 ^math:degrees radians ^math:pow sqrt ^math:random(ширина диапазона) @@ -854,6 +944,9 @@ math если нет, /dev/random, если нет, rand [на solaris /dev/random можно добавить] + ^math:uuid7[ $.lower(bool) $.solid(bool) ] + 0193CBF0-7898-7000-A391-AC513CC15658 + https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-7 ^math:uid64[ $.lower(bool) ] BA39BAB6340BE370 ^math:md5[string] @@ -867,7 +960,7 @@ math ^math:crc32[string] вычисляет crc32 строки ^math:sha1[string] - ^math:digest[[md5|sha1|sha256|sha512];строка или файл][[ $.format[hex|base64] $.hmac[ключ] ]] + ^math:digest[[md5|sha1|sha256|sha512];строка или файл][[ $.format[hex|base64|file] $.hmac[ключ строка|ключ файл] ]] объединяет в себе возможность работы с разными алгоритмами криптографического хеширования. $.hmac[ключ] для проверки целостности переданных данных @@ -877,6 +970,7 @@ inet ^inet:aton[IP] ^inet:name2ip[name][[ $.ipv[4|6|any] $.table(true) ]] прямое преобразование имени в IP адрес ^inet:ip2name[ip][ $.ipv[4|6|any] ]] обратное преобразование из IP адреса в имя + ^inet:hostname[]: возвращает имя хоста json @@ -897,7 +991,7 @@ json $.array[method-junction] пользовательский метод, которому будут передаваться массивы $.taint[язык преобразования] задаёт язык преобразования для всех строк результата ]] - парсит json-строку в хэш + парсит json-строку в хеш ^json:string[system or user object[; $.skip-unknown(false) отключить exception и выдавать 'null' при сериализации объектов с типами @@ -1116,6 +1210,7 @@ xnode ^node.selectNumber[xpath/query/expression] = double if any or die ^node.selectString[xpath/query/expression] = string if any or die + memory ^memory:compact[] собрать мусор, освободив место под новые данные (предупреждение: память процесса никогда не освобождается)