Этот оператор сравнивает выражение
Больше информации о регулярных выражениях можно найти в полном справочнике Джеффри Е. Ф. Фридла (Jeffrey E. F. Friedl) «Mastering Regular Expressions» (издательство O'Reilly) или по адресу
Если вы не знаете, что делает ~ с регулярными выражениями, вы просто обязаны достать экземпляр книги «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 и т. д., и все в рамках выражения диалплана.
Синтаксис
Функции диалплана имеют следующий основной синтаксис:
$ {
${
2 3 4 4321
Как вы, вероятно, уже заметили, необходимо быть очень внимательным с открывающими и закрывающими скобками. В примере выше парные открывающие и закрывающие круглые и фигурные скобки обозначены одинаковыми числами.
Примеры функций диалплана
Часто функции используются в сочетании с приложением Set() для получения или задания значения переменной. В качестве простого примера рассмотрим функцию LEN(). Эта функция вычисляет длину строки, заданной в качестве ее аргумента. Вычислим длину строки переменной и воспроизведем это значение для абонента: exten => 123,1,Set(TEST=example) exten => 123,n,SayNumber(${LEN(${TEST})})
Приведенный пример определит, что строка example содержит семь символов, задаст это значение как длину переменной и воспроизведет это число пользователю с помощью приложения SayNumber().
Рассмотрим еще один простой пример. Если бы мы захотели задать время ожидания для одного из каналов, то могли бы использовать функцию TIMEOUT(). Функция TIMEOUT() принимает один из трех аргументов: absolute (абсолютное), digit (между цифрами) и response (ответ). Чтобы задать максимальный промежуток времени между вводом цифр с помощью функции TIMEOUT(), можно воспользоваться приложением Set():
exten => s,1,Set(TIMEOUT(digit)=30) Обратите внимание на то, что функция не заключена в символы ${ }. Как и присвоение значения переменной, присвоение значения функции выполняется без использования символов ${ }.
Полный список доступных функций можно получить, введя команду core show functions в интерфейсе командной строки Asterisk. Также они представлены в приложении F.
Выполнение переходов по условию
После краткого ознакомления с выражениями и функциями пришло время использовать их на практике. Применение выражений и функций позволяет усложнить логику диалплана. Возможность принятия решений в диалплане обеспечивается выполнением
Приложение GotoIf()
Ключ к выполнению переходов по условию - приложение GotoIf(). GotoIf() вычисляет выражение и отправляет абонента в соответствующее место назначения в зависимости от истинности или ложности выражения.
GotoIf() использует особый синтаксис, который часто называют условным:
GotoIf(
• Метка приоритета в рамках того же добавочного номера, например weasels.
• Добавочный номер и метка приоритета в рамках того же контекста, например 123,weasels.
• Контекст, добавочный номер и метка приоритета, например incoming,123,weasels.
Любое из мест назначения может быть опущено, но не оба одновременно. Если согласно вычислениям переход должен осуществляться по месту назначения, которое не задано, Asterisk просто переходит к следующему приоритету текущего добавочного номера.
Применим GotoIf() в примере:
exten => 345,1,Set(TEST=1)
exten => 345,n,GotoIf($[${TEST} =
exten => 345,n(weasels),Playback(weasels-eaten-phonesys)
exten => 345,n,Hangup()
exten => 345,n(lguanas),Playback(office-iguanas)
exten => 345,n,Hangup()
Вы заметите, что за каждым приложением Playback() следует приложение Hangup(). Это делается для того, чтобы при переходе на метку weasels вызов заканчивался до того, как начинается воспроизведение звукового файла office-ig'uanas. Все чаще можно увидеть добавочные номера, разбитые на несколько компонентов (разделенных между собой командой Hangup()), каждый из которых представляет собой этапы, выполняемые следом за GotoIf().
Обычно при такой схеме, когда требуется оградить Asterisk от выполнения следующего приоритета после выполнения перехода, вероятно, лучше в качестве места назначения использовать другие добавочные номера, а не метки приоритетов. Во всяком случае, это делает диал- план несколько понятнее. Предыдущий фрагмент диалплана можно было бы переписать следующим образом: exten => 345,1,Set (TEST=1)
exten => 345,n,GotoIf($[${TEST} = 1]?weasels,1:iguanas,1); теперь переход
; выполняется к
exten => weasels,1,Playback(weasels-eaten-phonesys); это НЕ метка.
Предоставление условного перехода только на случай ложности