Asterisk™: будущее телефонии Второе издание
Шрифт:
В Asterisk выражения всегда начинаются со знака доллара ($) и открывающей квадратной скобки и заканчиваются закрывающей квадратной скобкой:
$[выражение]
Таким образом, упомянутые выше примеры будут записаны так:
$[${COUNT} + 1] $[${COUNT} / 2]
Когда Asterisk встречает в диалплане выражение, она заменяет его результирующим значением. Важно отметить, что это происходит после подстановки переменных. Чтобы продемонстрировать это, посмотрим на следующий фрагмент кода1:
exten => 321,1,Set(COUNT=3)
exten => 321,n,Set(NEWCOUNT=$[${COUNT} + 1])
exten => 321,n,SayNumber(${NEWCOUNT})
В
1. Asterisk подставляет в выражении вместо ${COUNT} число 3. Выражение, в сущности, превращается в следующее:
exten => 321,n,Set(NEWCOUNT=$[3 + 1])
2. Asterisk вычисляет выражение, суммируя 1 и 3, и заменяет его вычисленным значением, 4:
exten => 321,n,Set(NEWCOUNT=4)
3. Приложение Set присваивает значение 4 переменной NEWCOUNT. Третий приоритет просто вызывает приложение SayNumber, которое воспроизводит текущее значение переменной ${NEWCOUNT} (ей было присвоено значение 4 во втором приоритете).
Попробуйте это в своем диалплане.
Операторы
Код диалплана Asterisk записывается на специальном языке сценариев. Это означает, что язык диалплана Asterisk, как любой язык программирования, распознает символы, называемые операторами, которые позволяют оперировать переменными. Рассмотрим типы операторов, используемые в Asterisk: Логические (булевы) операторы
Эти операторы оценивают истинность выражения. С точки зрения вычислений это, по сути, означает, является ли выражение чем-то или оно является ничем (отличный от нуля или нуль, истина или ложь, включен или выключен и т. д.). К логическим операторам относятся:
Помните, что при ссылке на переменную используется просто ее имя, но при ссылке на значение переменной ее имя должно быть заключено в квадратные скобки и перед ними должен стоять знак доллара.
expr1 | expr2
Этот оператор (называемый оператором ИЛИ) в случае истинности выражения expr1 (не пустая строка и не нуль) возвращает результат его вычисления. В противном случае он возвращает результат вычисления выражения expr2.
expr1 & expr2
Это оператор (называемый оператором И) возвращает результат вычисления expr1, если оба выражения истинны (то есть если ни одно из выражений не дает в результате пустой строки или нуля). В противном случае возвращается нуль. expr1 {=, >, >=, <, <=, ! = } expr2
Эти операторы возвращают результаты сравнения целых чисел, если оба аргумента являются целыми числами; в противном случае возвращаются результаты сравнения строк. В результате сравнения получаем 1, если заданное отношение выполняется, или 0, если отношение не выполняется. (Сравнение строк выполняется соответственно текущим локальным настройкам операционной системы.)
Арифметические операторы
Хотите выполнить вычисление? Вам
Эти операторы возвращают результаты сложения или вычитания целочисленных аргументов. expr1 {*, /, %} expr2
Эти операторы возвращают результаты умножения, целочисленного деления или остаток от деления целочисленных аргументов соответственно.
Оператор регулярного выражения
Также в Asterisk может использоваться оператор регулярного выражения:
expr1 : expr2
Этот оператор сравнивает выражение expr1 с expr2, где последнее должно быть регулярным выражением1. Регулярное выражение привязывается к началу строки посредством явного задания 2.
Больше информации о регулярных выражениях можно найти в полном справочнике Джеффри Е. Ф. Фридла (Jeffrey E. F. Friedl) «Mastering Regular Expressions» (издательство O'Reilly) или по адресуexpressions.info.
Если вы не знаете, что делает ~ с регулярными выражениями, вы просто обязаны достать экземпляр книги «Mastering Regular Expressions». Она изменит вашу жизнь!
Если соответствие установлено и шаблон содержит по крайней мере одну подстроку регулярного выражения, \( ... \), возвращается строка, соответствующая \1; в противном случае оператор сопоставления возвращает число совпавших символов. Если соответствия не выявлено и шаблон не содержит подстроку регулярного выражения, возвращается нулевая строка; в противном случае, возвращается 0. Синтаксический анализатор Asterisk версии 1.0 был довольно прост, поэтому обязательным требованием было отделение операторов от всех остальных значений как минимум одним пробелом. Соответственно, следующая запись не обеспечивала бы желаемого результата:
exten => 123,1,Set(TEST=$[2+1]) Такая запись привела бы к присвоению переменной TEST строки 2+1, а не значения 3. Чтобы исправить это, надо поставить пробелы перед оператором и после него:
exten => 234,1,Set(TEST=$[2 + 1]) В Asterisk 1.2 или 1.4 это уже не является обязательным требованием, потому что синтаксический анализатор выражений был доработан с учетом таких типов сценариев. Однако ради удобства чтения по-прежнему рекомендуется отделять операторы пробелами. Чтобы добавить текст в начало или конец переменной, просто поместите его в выражении рядом:
exten => 234,1,Set(NEWTEST=$[blah${TEST}])
Функции диалплана
Функции диалплана делают выражения более мощными; их можно рассматривать как интеллектуальные переменные. Функций диалпла- на позволяют вычислять длины строк, даты и время, контрольные суммы MD5 и т. д., и все в рамках выражения диалплана.
Синтаксис
Функции диалплана имеют следующий основной синтаксис:
ИМЯ_ФУНКЦИИ( аргумент) Как и для переменных, ссылка на имя функции выполняется, как показано выше, а чтобы использовать значение функции, необходимо поставить впереди знак доллара и заключить функцию в фигурные скобки: