Выражения

Синтаксис

В данной статье при описании выражений приняты следующие обозначения:

  • Элементы выражений разделены тильдой.

  • Круглые скобки служат для группировки элементов выражения.

  • Если в выражении используется литерал скобок или других символов, они заключаются в кавычки: "(".

  • Квантификаторы после элементов и групп обозначают количество повторений:

    • ? — элемент необязателен, может отсутствовать в выражении;

    • + — элемент обязателен и может повторяться в выражении несколько раз;

    • * — элемент может отсутствовать или повторяться несколько раз.

Комментарий

Комментарий используется для целей документирования программного кода и обозначается символом #. Каждая строка комментария должна начинаться с символа #. В настоящее время VRL не поддерживает многострочные комментарии.

Примеры

# комментарий
# комментарий
# из нескольких строк

Ключевые слова

Ключевые слова — это зарезервированные слова, используемые для базовых функций языка, таких как работа с условиями (if). Они не могут использоваться для наименования переменных или других пользовательских директив. Следующие слова зарезервированы:

  • abort

  • as

  • break

  • continue

  • else

  • false

  • for

  • if

  • impl

  • in

  • let

  • loop

  • null

  • return

  • self

  • std

  • then

  • this

  • true

  • type

  • until

  • use

  • while

Пробелы

Пробел — это любая непустая строка, определенная свойством Unicode White_Space.

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

Литералы

Пустое значение (Null)

Литерал пустого значения представляет отсутствие определенного значения.

Пример

null

Логическое значение (Boolean)

Литерал типа логическое выражение представляет собой двоичное значение, которое может быть только истинным (true) или ложным (false).

Примеры

true
false

Целое число (Integer)

Литерал типа целое число — это последовательность цифр, представляющая 64-битное знаковое целое число.

Примеры

1_000_000
1000000

Характеристики

Ограничения

Целые числа в VRL могут находиться в диапазоне от -9223372036854775807 до 9223372036854775807. Числа за пределами этого диапазона оборачиваются.

Подчеркивание

Целые числа могут использовать символ подчеркивания (_) вместо , для улучшения читаемости. Например, 1_000_000.

Число с плавающей точкой (Float)

Литерал типа число с плавающей точкой представляет собой десятичное представление 64-битного числа с плавающей точкой (в частности, тип "binary64", определенный в IEEE 754-2008).

Десятичный литерал с плавающей точкой состоит из целой части (десятичные цифры), десятичной точки и дробной части (десятичные цифры).

Примеры

1_000_000.01
1000000.01
1.001

Характеристики

Ограничения

Числа с плавающей точкой в VRL могут находиться в диапазоне от -1.7976931348623157E+308f64 до 1.7976931348623157E+308f64. Числа за пределами этого диапазона оборачиваются.

Подчеркивания

Числа с плавающей точкой могут использовать символ подчеркивания (_) вместо , для улучшения читаемости. Например, 1_000_000.

Метка времени (Timestamp)

Литерал метки времени — это нативная метка времени, выраженная в формате RFC 3339 с точностью до наносекунды.

Метки времени определяются с помощью символа t и заключаются в одинарные кавычки (t'2021-02-11T10:32:50.553955473Z').

Примеры

t'2021-02-11T10:32:50.553955473Z'
t'2021-02-11T10:32:50.553Z'
t'2021-02-11T10:32:50.553-04:00'

Характеристики

Часовые пояса

Как определено в формате RFC 3339, литералы меток времени поддерживают UTC и локальные смещения времени.

Строка (String)

Литерал строки представляет собой строку, закодированную в UTF-8. Строковые литералы могут быть сырыми или интерпретированными.

Сырые (raw) строковые литералы состоят из неинтерпретированных (неявно закодированных в UTF-8) символов между одинарными кавычками и обозначаются символом s (s'…​'). В частности, обратная косая черта не имеет особого значения, и строка может содержать символы новой строки.

Интерпретированные строковые литералы представляют собой последовательности символов между двойными кавычками ("…​"). Внутри кавычек может находиться любой символ, кроме неэкранированного символа новой строки и неэкранированной двойной кавычки. Текст между кавычками представляет собой результат литерала, с экранированными символами, интерпретируемыми как показано ниже. Строки можно шаблонизировать, заключив переменные в {{..}}. Значения переменных вставляются в строку на указанной позиции.

Примеры

"Hello, world! 🌎"
"Hello, world! \u1F30E"
"Hello, \
world!"
"Hello, {{ planet }}!"
s'Hello, world!'
s'{ "foo": "bar" }'

Характеристики

Экранирование

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

Строки, начинающиеся с символа $ ($foo), интерпретируются в VRL-блоках элементов экспертизы как переменные окружения. Чтобы избежать этого, экранируйте такие строки символом $ ($$foo).
Опция Описание

\u{7FFF}

Символ Unicode из 24 бит (до 6 цифр)

\n

Перенос строки

\r

Возврат каретки

\t

Табуляция

\\

Обратная косая черта

\0

Нуль-символ

\"

Двойные кавычки

\'

Одинарные кавычки

\{

Фигурные скобки

Шаблоны

Строку можно шаблонизировать, заключив имя переменной в {{..}}. Значение переменной вставляется в строку на этой позиции во время выполнения. Переменная должна быть строкой. Поддерживаются только переменные. Если вы хотите вставить путь из события, вы должны сначала присвоить его переменной. Чтобы вставить {{ в строку, его можно экранировать с помощью символа \: \{{..\}}.

Многострочные литералы

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

Конкатенация

Строки можно объединять с помощью оператора +.

Недопустимые символы

Недопустимые последовательности UTF-8 заменяются символом .

Регулярное выражение (Regex)

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

Регулярные выражения определяются с помощью символа r и заключаются в одинарные кавычки: r'…​'. Используется синтаксис регулярных выражений Rust.

Для изучения регулярных выражений в VRL рекомендуется использовать редактор и тестер выражений Rustexp.

Обычные и специальные символы

Представление Описание Эквиваленты

a

Большинство символов представляют сами себя.

\x61

\u0061

\U00000061

\\

Специальные символы [ ] \ / ^ $ . | ? * + ( ) { } для представления самих себя должны быть экранированы.

\x5C

\x61

Шестнадцатеричный код символа ASCII из двух цифр.

a

\u0062

Шестнадцатеричный код символа Unicode из четырех цифр.

b

\U00000062

Шестнадцатеричный код символа Unicode из восьми цифр.

c

\x{00003A9} \u{000003A9} \U{3A9}

Любой шестнадцатеричный код, которому соответствует символ Unicode.

Ω

\t

Символ горизонтальной табуляции.

\x09

\n

Символ перевода строки

\x0A

\r

Символ возврата каретки.

\x0D

\v

Символ вертикальной табуляции.

\x0B

\a

Символ звукового сигнала.

\x07

\f

Символ смены страницы.

\x0C

Метасимволы и специальные символьные классы

Представление Описание Эквиваленты

.

Метасимвол, обозначающий любой символ, кроме символа перевода строки \n.

\p{Property}

Любой символ со свойством Unicode, указанным в фигурных скобках.

Список поддерживаемых свойств описан в документе.

\P{Property}

Любой символ, не имеющий свойства Unicode, указанного в фигурных скобках.

\pX

Любой символ Unicode, относящийся к классу, обозначенному одной буквой:

  • L — "алфавитные" символы: буквы и идеограммы всех письменностей;

  • M — диакритические символы;

  • N — цифры;

  • P — знаки препинания;

  • S — знаки валют, математические и иные обозначения;

  • Z — пробельные символы, разделители строк и абзацев;

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

\p{Property}

\PX

Любой символ Unicode, не относящийся к классу, обозначенному одной буквой.

\P{Property}

[[:ascii:]]

Любой символ ASCII.

[\x00-\x7F]

[[:print:]]

Любой символ ASCII, доступный для печати: любой символ, кроме управляющих.

[ -~]

[[:graph:]]

Любой отображаемый символ ASCII: любой символ, кроме управляющих и пробельных.

[!-~]

\w

Любой символ Unicode, входящий в состав слов: буква или идеограмма любой письменности, диакритический символ, цифра, знак пунктуации, соединяющий слова (например, _), управляющий символ для лигатур.

[\p{Alphabetic}\p{M}\d\p{Pc}\p{Join_Control}]

\W

Любой символ Unicode, не входящий в состав слов.

[^\w]

[[:word:]]

Любая буква базового латинского алфавита, цифра ASCII или подчеркивание.

[0-9A-Za-z_]

(?-u:\w)

[\w&&\p{ascii}]

[[:alnum:]]

Любая буква базового латинского алфавита или цифра ASCII.

[0-9A-Za-z]

[[:alpha:]]

Любая буква базового латинского алфавита.

[A-Za-z]

[[:upper:]]

Любая прописная буква базового латинского алфавита.

[A-Z]

[[:lower:]]

Любая строчная буква базового латинского алфавита.

[a-z]

\d

Любая десятичная цифра Unicode.

\p{Nd}

\D

Любой символ, кроме десятичных цифр Unicode.

[^\d]

[[:digit:]]

Любая десятичная цифра ASCII.

[0-9]

[\d&&\p{ascii}]

(?-u:\d)

[[:xdigit:]]

Любая шестнадцатеричная цифра.

[0-9A-Fa-f]

[[:punct:]]

Любой знак препинания ASCII.

+[!-/:@\\\[\]\{\}\(\)~]+`

\s

Любой пробельный символ (символ со свойством Unicode Whitespace).

\p{White_Space}

\S

Любой символ, кроме пробельных.

\P{White_Space}

[[:space:]]

Любой пробельный символ ASCII.

[\t\n\v\f\r ]

[[:blank:]]

Пробел или горизонтальная табуляция.

[\t ]

[[:cntrl:]]

Любой управляющий символ ASCII.

[\x00-\x1F\x7F]

Символьные классы и перечисление

Представление Описание Найденные совпадения

xy

Последовательность x и y.

xy

x|y

Перечисление: одна из последовательностей x или y, причем предпочтение отдается x.

x

[xyz]

Объединение: символы из указанных в квадратных скобках.

x, y, z

[^xyz]

Отрицание: все символы, кроме указанных в квадратных скобках.

Все символы, кроме x, y и z.

[a-z]

Диапазон: все символы между указанными.

Символы от a до z включительно.

[x[^xyz]]

Вложенный класс: все символы, указанные хотя бы в одном из классов.

Все символы, кроме y и z.

[a-y&&xyz]

Пересечение: символы, которые входят в оба класса.

x, y

[0-9—​4]

Разность: символы первого класса, которые не входят во второй класс. (Эквивалентно записи [0-9&&[^4]]).

Все десятичные цифры ASCII, кроме 4.

[a-g~~b-h]

Симметрическая разность: символы, которые входят лишь в один класс из указанных.

a, h

Приоритет в перечислениях:

В перечислениях проверяется каждый указанный вариант слева направо, поиск прекращается при первом совпадении.

Пример

Example 1. Исходный код
.res = parse_regex_all!("authentication", r'authentication|auth', numeric_groups: true)
Example 2. Результат
[
  {
    "0": "authentication"
  }
]

Здесь функция с шаблоном r'authentication|auth' сначала пытается найти последовательность "authentication", и поскольку она полностью соответствует строке, именно это совпадение и будет возвращено. Однако, если изменить порядок вариантов, изменится и результат.

Example 3. Исходный код
.res = parse_regex_all!("authentication", r'auth|authentication', numeric_groups: true)
Example 4. Результат
[
  {
    "0": "auth"
  }
]

При таком порядке вариантов сначала будет найдено "auth". На этом поиск остановится и вернет "auth", несмотря на то, что более длинный вариант "authentication" также соответствует строке.

Порядок вычисления символьных классов:

  1. Диапазоны: выражение r'[а-яё]' равнозначно выражению r'[[а-я]ё]' и выбирает все строчные буквы русского алфавита.

  2. Объединение: выражение r'[ab&&bc]' равнозначно выражению r'[[ab]&&[bc]]' и выбирает символы, которые входят в оба класса.

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

    r'[\pL--\p\{Greek}&&\p\{Uppercase}]'

    равнозначно такому выражению:

    r'[[\pL--\p\{Greek}]&&\p\{Uppercase}]'

    Эти выражения выбирают все "алфавитные" символы в верхнем регистре, кроме греческих.

  4. Отрицание: выражение r'[^a-z&&[:xdigit:]]' равнозначно выражению r'[^[a-z&&[:xdigit:]]]'.

    Эти выражения выбирают все символы, кроме тех, которые одновременно являются шестнадцатеричными цифрами и строчными латинскими буквами.

Группировка

Группы в круглых скобках определяют области действия флагов, квантификаторов, и перечислений.

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

Представление Описание

(exp)

Нумерованная группа захвата.

(?P<name>exp)

Именованная группа захвата. Возможно обращение как по номеру, так и по ключу, указанному в угловых скобках. (Эквивалентно записи (?<name>exp).)

Имя может включать "алфавитные" символы и цифры Unicode, а также символы .,_[] и начинаться с "алфавитного" символа либо подчеркивания.

(?:exp)

Незахватываемая группа.

(?x)

Установка флага x внутри текущей группы.

(?-x)

Выключение флага x внутри текущей группы.

(?x-y:exp)

Установка флагов x и выключение флага y внутри незахватываемой группы.

Пример

Рассмотрим следующую функцию:

Example 5. Исходный код
.res = parse_regex!("2012-12-12", r'(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})')
Example 6. Результат
{
  "res": {
    "d": "12",
    "m": "12",
    "y": "2012"
  }
}

Данная функция извлекает из строки с датой вида YYYY-MM-DD группы, содержащие год, месяц и число с ключами y, m и d соответственно.

Квантификаторы

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

При жадной квантификации возвращается наиболее длинная строка из возможных соответствий, при ленивой — наиболее короткая.

Представление Описание Поведение

x?

Ноль или одно повторение x.

Жадная квантификация

x*

Ноль или больше повторений x.

Жадная квантификация

x+

Одно или больше повторений x.

Жадная квантификация

x??

Ноль или одно повторение x.

Ленивая квантификация

x*?

Ноль или больше повторений x.

Ленивая квантификация

x+?

Одно или больше повторений x.

Ленивая квантификация

x{n}

В точности n повторений x. Аналогично записи x{n}?.

x{n,}

Как минимум n повторений x.

Жадная квантификация

x{n,m}

Между n и m повторений x

Жадная квантификация

x{n,}?

Как минимум n повторений x.

Ленивая квантификация

x{n,m}?

Между n и m повторений x

Ленивая квантификация

Примеры

Следующая функция ищет последовательности символов, заключенные в квадратные скобки.

Example 7. Исходный код
.res = parse_regex_all!("[ERROR] [2024-10-05 10:01:00] [code: 500]", r'\[.*\]', numeric_groups: true)
Example 8. Результат
[
  {
    "0": "[ERROR] [2024-10-05 10:01:00] [code: 500]"
  }
]

Если заменить квантификатор на ленивый: r'\[.*?\]', функция вернет отдельные подстроки в квадратных скобках.

Example 9. Исходный код
.res = parse_regex_all!("[ERROR] [2024-10-05 10:01:00] [code: 500]", r'\[.*?\]', numeric_groups: true)
Example 10. Результат
[
  {
    "0": "[ERROR]"
  },
  {
    "0": "[2024-10-05 10:01:00]"
  },
  {
    "0": "[code: 500]"
  }
]

Позиция в тексте

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

Представление Описание

^

Начало текста (в многострочном режиме — начало строки).

$

Конец текста (в многострочном режиме — конец строки).

\A

Только в начале текста, в т. ч. в многострочном режиме.

\z

Только в конце текста, в т. ч. в многострочном режиме.

\b

Граница слова Unicode: символ, соответствующий классу \w с одной стороны, и символ, соответствующий классу \W, либо граница текста, с другой стороны.

\B

Не на границе слова Unicode.

\b{start}, \<

Начало слова Unicode: символ класса \W или начало текста слева, символ класса \w справа.

\b{end}, \>

Конец слова Unicode: символ класса \w слева, символ класса \w или конец текста справа.

\b{start-half}

Проверка начала слова Unicode только слева: символ класса \W или начало текста.

\b{end-half}

Проверка конца слова Unicode только справа: символ класса \W или конец текста.

Примеры

Следующая функция возвращает последовательности алфавитно-цифровых и соединительных символов на границе слова.

Example 11. Исходный код
.res = parse_regex_all!("@guest, @superuser, @root", r'(?P<user>\b\w+)')
Example 12. Результат
[
  {
    "user": "guest"
  },
  {
    "user": "superuser"
  },
  {
    "user": "root"
  }
]

Чтобы получить последовательности с символом @, изменим проверку начала слова.

Example 13. Исходный код
.res = parse_regex_all!("@guest, @superuser, @root", r'(?P<user>\b{start-half}@\w+)')
Example 14. Код
[
  {
    "user": "@guest"
  },
  {
    "user": "@superuser"
  },
  {
    "user": "@root"
  }
]

Флаги

Регулярные выражения позволяют использовать флаги — модификаторы, которые изменяют поведение поиска для всего выражения или группы. Флаги могут быть объединены: r'(?ixm)pattern', r'(?im)pattern'. Флаги можно включать и выключать внутри выражения.

Опция Описание Состояние по умолчанию

i

Режим без учета регистра: буквы в выражении соответствуют и прописным, и строчным буквам в строке.

Выключен

m

Многострочный режим:

  • ^ соответствует началу новой строки.

  • $ соответствует концу строки.

Выключен

x

Режим с поддержкой комментариев. Строчные комментарии должны начинаться с символа #.

Пробелы при включенном режиме игнорируются. Чтобы добавить в шаблон пробел, можно использовать экранирование: \ ` или шестнадцатеричный код: \x20.

Выключен

s

Разрешает метасимволу точки . соответствовать символу новой строки \n.

Выключен

U

Меняет местами значение квантификаторов x* и x*? (ленивый режим).

Выключен

u

Поддержка Unicode.

Включен

Примеры

Рассмотрим следующую функцию:

Example 15. Исходный код
.res = parse_regex!("AaAaAbbBBBb", r'(?i)a+(?-i)b+', numeric_groups: true)
Example 16. Результат
{
  "0": "AaAaAbb"
}

В начале регулярного выражения включается регистронезависимый режим, поэтому a+ соответствует буквам a и A. Однако b+, после выключения регистронезависимого режима, соответствует только строчной b.

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

Example 17. Исходный код
replace_with("2022-01-05, 2023-08-25 и 2024-10-18", r'(?x)
  (?P<y>\d{4}) # год из 4 цифр Unicode
  -
  (?P<m>\d{2}) # месяц из 2 цифр Unicode
  -
  (?P<d>\d{2}) # день из 2 цифр Unicode
') -> |match| {
    to_string(match.d) + "/" + to_string(match.m) + "/" + to_string(match.y)
}
Example 18. Результат
"05/01/2022, 25/08/2023 и 18/10/2024"

Массив

Литерал массива представляет собой набор выражений, разделенных запятыми, который создает непрерывный массив. Массив может быть динамически расширен.

Примеры

[]
["первый", "второй", "третий"]
["смешанный", 1, 1.0, true, false, {"foo": "bar"}]
["первый-уровень", ["второй-уровень", ["третий-уровень"]]
[.поле1, .поле2, to_int!("2"), переменная_1]
[
"выражения",
1 + 2,
2 == 5,
true || false
]

Объект

Литерал объекта представляет собой расширяемую структуру ключ/значение, которая синтаксически эквивалентна JSON-объекту.

Верно сформированный JSON-документ является допустимым объектом VRL.

Примеры

{
"поле1": "значение1",
"поле2": [ "значение2", "значение3", "значение4" ],
"поле3": { "поле4": "значение5" }
}
{
"поле1": .некий_путь,
"поле2": некая_переменная,
"поле3": { "подполе": "некое значение" }
}

Характеристики

Упорядочивание

Поля объекта упорядочены по ключу в алфавитном порядке по возрастанию. Таким образом, операции, такие как кодирование в JSON, производят строку с ключами, упорядоченными в алфавитном порядке.

Динамические выражения

Переменная

Выражение переменной именует переменные. Переменная представляет собой последовательность из одной или нескольких букв и цифр. Первый символ в переменной должен быть буквой.

Синтаксис

первый ~ (последующий)*
Аргумент Значение

первый

первый символ может быть только буквенно-цифровым символом (a-zA-Z0-9).

последующий

последующие символы должны содержать только ASCII буквенно-цифровые символы и подчеркивания (a-zA-Z0-9_).

Примеры

Простая переменная

Example 19. Программа VRL
my_variable = 1
Example 20. Результат
1

Переменная с путем

Example 21. Программа VRL
my_object = { "one": 1 }
my_object.one
Example 22. Результат
1

Присваивание

Выражение присваивания присваивает результат выражения справа от знака равенства цели слева (пути или переменной).

Синтаксис

цель ~ ("," ~ ошибка)? ~ оператор ~ выражение
Аргумент Значение

цель

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

ошибка

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

оператор

оператор разделяет цель и выражение и определяет условия присваивания.

выражение

Если цель — это переменная, выражение может быть любым выражением.

Если цель — это путь, выражение может быть любым выражением, которое возвращает поддерживаемый тип значения объекта (то есть выражение, не являющееся регулярным).

Примеры

Присваивание пути

Example 23. Программа VRL
.message = "Hello, World!"

Присваивание по вложенному пути

Example 24. Программа VRL
.parent.child = "Hello, World!"

Двойное присваивание

Example 25. Программа VRL
.first = .second = "Hello, World!"

Присваивание элемента массива

Example 26. Программа VRL
.array[1] = "Hello, World!"

Присваивание переменной

Example 27. Программа VRL
my_variable = "Hello, World!"
Example 28. Результат
Hello, World!

Присваивание со слиянием объектов

Example 29. Программа VRL
my_variable = {"message": "Hello, World!"}
my_variable |= {"level": "info"}
Example 30. Результат
{
"level": "info",
"message": "Hello, World!"
}

Присваивание с возможностью ошибки (успех)

Example 31. Программа VRL
.parsed, .err = parse_json("{\"Hello\": \"World!\"}")

Присваивание с возможностью ошибки (ошибка)

Example 32. Программа VRL
.parsed, .err = parse_json("malformed")

Путь

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

Синтаксис

"." ~ сегменты_пути
Аргумент Значение

"."

Символ . представляет корень события. Все пути должны начинаться с . или %.

"%"

Символ % представляет корень метаданных события.

сегменты_пути

cегменты_пути обозначают сегмент вложенного пути. Каждый сегмент должен быть отделен точкой и может содержать только буквенно-цифровые символы и подчеркивание (a-zA-Z0-9_). Сегменты, содержащие символы вне этого диапазона, должны быть заключены в кавычки.

Примеры

Корневой путь события

Example 33. Событие Vector
{
"message": "Hello, World!"
}
Example 34. Программа VRL
.
Example 35. Результат
{
"message": "Hello, World!"
}

Корневой путь метаданных

Example 36. Событие Vector
{
"message": "Hello, World!"
}
Example 37. Программа VRL
%
Example 38. Результат
{}

Путь верхнего уровня

Example 39. Событие Vector
{
"message": "Hello, World!"
}
Example 40. Программа VRL
.message
Example 41. Результат
Hello, World!

Вложенный путь

Example 42. Событие Vector
{
"parent": {
"child": "Hello, World!"
}
}
Example 43. Программа VRL
.parent.child
Example 44. Результат
Hello, World!

Объединение вложенных путей

Example 45. Событие Vector
{
"grand_parent": {
"parent2": {
"child": "Hello, World!"
}
}
}
Example 46. Программа VRL
.grand_parent.(parent1 | parent2).child
Example 47. Результат
Hello, World!

Путь элемента массива (первый)

Example 48. Событие Vector
{
"массив": [
"первый",
"второй"
]
}
Example 49. Программа VRL
.array[0]
Example 50. Результат
первый

Путь элемента массива (второй)

Example 51. Событие Vector
{
"массив": [
"первый",
"второй"
]
}
Example 52. Программа VRL
.array[1]
Example 53. Результат
second

Путь в кавычках

Example 54. Событие Vector
{
"parent.key.with.special characters": {
"child": "Hello, World!"
}
}
Example 55. Программа VRL
."parent.key.with.special characters".child
Example 56. Результат
Hello, World!

Индекс

Выражение индекса обозначает элемент массива. Индексы массивов в VRL начинаются с нуля.

Синтаксис

"[" ~ индекс ~ "]"
Аргумент Значение

индекс

индекс представляет собой нулевую позицию элемента.

Примеры

Выражение индекса массива

Example 57. Событие Vector
{
" массив ": [
"первый",
"второй"
]
}
Example 58. Программа VRL
.array[0]
Example 59. Результат
first

Арифметическое выражение

Арифметическое выражение выполняет операцию над двумя выражениями (операндами) согласно оператору.

Хотя арифметическое выражение обычно применяется к числам, его можно и с другими типами, такими как строки.

Синтаксис

выражение ~ оператор ~ выражение
Аргумент Значение

выражение

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

оператор

оператор определяет операцию, выполняемую над операндами слева и справа.

Примеры

Сложение целых чисел

Example 60. Программа VRL
1 + 1
Example 61. Результат
2

Сложение чисел с плавающей точкой

Example 62. Программа VRL
1.0 + 1.0
Example 63. Результат
2

Сложение чисел разных типов

Example 64. Программа VRL
1 + 1.0
Example 65. Результат
2

Сложение строк

Example 66. Программа VRL
"Hello" + ", " + "World!"
Example 67. Результат
Hello, World!

Вычитание целых чисел

Example 68. Программа VRL
2 - 1
Example 69. Результат
1

Вычитание чисел с плавающей точкой

Example 70. Программа VRL
2.0 - 1.0
Example 71. Результат
1

Вычитание чисел разного типа

Example 72. Программа VRL
2.0 - 1
Example 73. Результат
1

Перемножение целых чисел

Example 74. Программа VRL
2 * 1
Example 75. Результат
2

Перемножение чисел с плавающей точкой

Example 76. Программа VRL
2.0 * 1.0
Example 77. Результат
2

Перемножение чисел разного типа

Example 78. Программа VRL
2.0 * 1
Example 79. Результат
2

Деление с плавающей точкой (целые числа)

Example 80. Программа VRL
2 / 1
Example 81. Результат
2

Деление с плавающей точкой (числа с плавающей точкой)

Example 82. Программа VRL
2.0 / 1.0
Example 83. Результат
2

Деление с плавающей точкой (числа разных типов)

Example 84. Программа VRL
2.0 / 1
Example 85. Результат
2

Для нахождения остатка используйте функцию mod.

Example 86. Программа VRL
mod(3, 2)
Example 87. Результат
1

Сравнение

Выражение сравнения сравнивает два выражения (операнда) и возвращает логическое значение в соответствии с оператором.

Синтаксис

выражение ~ оператор ~ выражение
Аргумент Значение

выражение

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

оператор

оператор определяет операцию, выполняемую над операндами слева и справа.

Примеры

Равно

Example 88. Программа VRL
1 == 1
Example 89. Результат
true

Не равно

Example 90. Программа VRL
1 != 2
Example 91. Результат
true

Больше или равно

Example 92. Программа VRL
2 >= 2
Example 93. Результат
true

Больше

Example 94. Программа VRL
2 > 1
Example 95. Результат
true

Меньше или равно

Example 96. Программа VRL
2 <= 2
Example 97. Результат
true

Меньше

Example 98. Программа VRL
1 < 2
Example 99. Результат
true

Логическое выражение

Выражение логического типа сравнивает два выражения (операнды), прекращая вычисление на последнем выражении, вычисленном в соответствии с оператором.

Синтаксис

выражение ~ оператор ~ выражение
Аргумент Значение

выражение

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

оператор

оператор определяет операцию, выполняемую над операндами слева и справа.

Примеры

AND

Example 100. Программа VRL
true && true
Example 101. Результат
true

OR с логическим значением

Example 102. Программа VRL
false || "foo"
Example 103. Результат
foo

OR с пустым значением

Example 104. Программа VRL
null || "foo"
Example 105. Результат
foo

NOT

Example 106. Программа VRL
!false
Example 107. Результат
true

Объединение

Выражение объединения состоит из нескольких выражений (операндов), разделенных оператором объединения ??. Логика объединения позволяет выбирать из списка выражений первое значение, которое соответствует заданному условию.

Оператор ?? полезен при обработке ошибок, так как позволяет задавать альтернативные способы обработки данных.

Синтаксис

выражение ~ (оператор ~ выражение)+
Аргумент Значение

выражение

выражение (операнд) может быть любым выражением.

оператор

оператор разделяет два или более выражения.

Примеры

Объединение при ошибках

Example 108. Программа VRL
parse_syslog("не Syslog") ?? parse_common_log("не Common Log Format") ?? "malformed"
Example 109. Результат
malformed

Условие

Выражение условия определяет условное выполнение двух ветвей в зависимости от значения логического выражения. Если логическое выражение оценивается как истинное (true), выполняется ветвь "if". В противном случае выполняется ветвь "else", если она присутствует.

Синтаксис

"if" ~ предикат ~ блок ~ ("else if" ~ предикат ~ блок)* ~ ("else" ~ блок)?
Аргумент Значение

предикат

предикат должен быть выражением, которое приводится к значению логического типа. Если логическое значение не возвращается, возникает ошибка на этапе компиляции. Предикат может содержать несколько выражений. Несколько предикатов выражений должны быть заключены в скобки. Выражения должны быть разделены точкой с запятой (;) или новой строкой.

Примеры

Условие if true

Example 110. Программа VRL
if true {
"Hello, World!"
}
Example 111. Результат
Hello, World!

Условие if false

Example 112. Программа VRL
if false {
# not evaluated
null
}
Example 113. Результат
null

Условие if/else

Example 114. Программа VRL
if false {
# not evaluated
null
} else {
"Hello, World!"
}
Example 115. Результат
Hello, World!

Условие if / else if / else

Example 116. Программа VRL
if false {
# not evaluated
null
} else if false {
# not evaluated
null
} else {
"Hello, World!"
}
Example 117. Результат
Hello, World!

Многострочное выражение

Example 118. Программа VRL
x = 3
if (x = x + 1; x == 5) {
# not evaluated
null
} else if (
x = x + 1
x == 5
) {
"Hello, World!"
}
Example 119. Результат
Hello, World!

Вызов функции

Выражение вызова функции вызывает встроенные функции VRL.

Синтаксис

функция ~ прерывание? ~ "(" ~ аргументы? ~ ")" ~ замыкание?
Элемент синтаксиса Значение

функция

Имя встроенной функции.

прерывание

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

result = f!()

В противном случае ошибки должны обрабатываться:

result, err = f()

Отсутствие обработки ошибок от функций, которые могут возвращать ошибку, приводит к ошибкам на этапе компиляции. Смотрите Справочник ошибок VRL для дополнительной информации.

аргументы

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

замыкание

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

for_each([]) -> |index, value| {
<блок>
}

Примеры

Позиционный вызов функции

Example 120. Программа VRL
split("hello, world!", ", ")
Example 121. Результат
[
"hello",
"world!"
]

Вызов функции с именованными аргументами (упорядоченными)

Example 122. Программа VRL
split("hello, world!", pattern: ", ")
Example 123. Результат
[
"hello",
"world!"
]

Вызов функции с именованными аргументами (неупорядоченными)

Example 124. Программа VRL
split(pattern: ", ", value: "hello, world!")
Example 125. Результат
[
"hello",
"world!"
]

Прерывание

Выражение прерывание приводит к завершению программы VRL, прерывая любые изменения, вносимые в событие.

Синтаксис

прерывание ~ сообщение?
Аргумент Значение

сообщение

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

Примеры

Игнорирование недопустимых событий

Example 126. Событие Vector
{
"message": "hello world"
}
Example 127. Программа VRL
if contains(string!(.message), "hello") {
abort
}
.message = "not hello world"
Example 128. Результат
{
"message": "hello world"
}

Блок

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

Блоки не могут быть пустыми. Вместо этого пустые блоки ({}) рассматриваются как пустые объекты.

Синтаксис

"{" ~ NEWLINE* ~ выражения ~ NEWLINE* ~ "}"
Аргумент Значение

выражения

Одно или несколько выражений.

Примеры

Простой блок

Example 129. Программа VRL
{
message = "{\"Hello\": \"World!\"}"
parse_json!(message)
}
Example 130. Результат
{
"Hello": "World!"
}

Присваивание в блоке

Example 131. Программа VRL
.structured = {
message = "{\"Hello\": \"World!\"}"
parse_json!(message)
}