eventMacro
Переменные
- Есть возможность работать с переменными. Объявлять переменные не нужно. Все переменные макросов - глобальные, т.е. переменная из одного макроса может быть использована в другом макросе.
- Система переменных в eventMacro основывается на типах данных языка Perl. Переменные могут быть скалярами, массивами и хешами.
- В названии переменной можно использовать только буквы и цифры.
- Если Вы хотите использовать какую-либо переменную без подстановки её значения, то следует экранировать её с помощью "\" (например,
\$var
).
Типы переменных
- Скаляр
- Скалярная переменная содержит только одну величину, например, число и\или текст.
- Скалярные переменные начинаются со знака $.
- Массив
- Переменная массив содержит список величин (элементов).
- У каждого элемента в массиве есть свой индекс, который указывает на позицию в списке.
- Первый элемент массива имеет индекс 0, а последний - длина массива минус один.
- Массивы начинаются со знака @.
- Хэш
- Переменная хэш содержит пары величин.
- Каждая пара состоит из ключа и значения.
- Каждый ключ имеет только одно значение, но несколько ключей могут иметь одинаковые значения.
- Хэши начинаются со знака %.
Объявление и использование
Скаляр
- Присвоить переменной значение:
$variable = значение
- Присвоить переменной значение:
- Получить значение переменной (НО это касается только макросов, для автомакросов есть другой синтаксис, как и для параметров конфига и т.п.):
$variable
- Получить значение переменной (НО это касается только макросов, для автомакросов есть другой синтаксис, как и для параметров конфига и т.п.):
macro Hello { $var = Hello $var1 = World! log $var $var1 }
- Данный макрос выведет на консоль:
[eventmacro message] Hello World!
- Увеличить на 1 значение переменной:
$variable++
или уменьшить$variable--
.
- Увеличить на 1 значение переменной:
macro Counter { $counter = 0 log Значение счётчика: $counter $counter++ log Новое значение: $counter $counter-- log Прежнее значение: $counter }
- В консоли увидим:
[eventmacro message] Значение счётчика: 0 [eventmacro message] Новое значение: 1 [eventmacro message] Прежнее значение: 0
- Переменную можно удалить, присвоив ей специальное значение undef или unset:
macro undef { $counter = 0 $x = 1 log \$x = $x $x = undef # также можно использовать 'unset' log \$x теперь уничтожена: $x }
- В консоли увидим:
[eventmacro message] $x = 1 [eventmacro message] $x теперь уничтожена:
- Операция присвоения не вычисляет значение справа от знака равно, а тупо подставляет вместо переменных их величины. Для расчетов нужно вызывать функцию
&eval()
.
- Операция присвоения не вычисляет значение справа от знака равно, а тупо подставляет вместо переменных их величины. Для расчетов нужно вызывать функцию
macro math { $num = 2 $num2 = 3 $result = $num+$num2 $result2 = &eval($num+$num2) log обычная подстановка значений переменных \$result = $result log сумма $num и $num2 равна $result2 }
- В консоли увидим:
[eventmacro message] обычная подстановка значений переменных $result = 2+3 [eventmacro message] сумма 2 и 3 равна 5
Массив
- Присвоить массиву несколько значений можно указав в их скобках через запятую:
@variable = (member0, member1, member2)
- Присвоить массиву несколько значений можно указав в их скобках через запятую:
- Получить доступ к конкретному элементу массива можно по его индексу. Для этого нужно вместо знака @ подставить $ и в квадратных скобках [...] указать индекс элемента:
$variable[0]
- Получить доступ к конкретному элементу массива можно по его индексу. Для этого нужно вместо знака @ подставить $ и в квадратных скобках [...] указать индекс элемента:
- Узнать длину массива:
@variable
- Узнать длину массива:
macro Hello { @var = (drops, poring) log Кол-во элементов в массиве \@var = @var, первый элемент: $var[0], второй элемент: $var[1] }
- В консоли увидим:
[eventmacro message] Кол-во элементов в массиве @var = 2, первый элемент: drops, второй элемент: poring
- Отдельные элементы массива - это скалярные переменные.
- Элементам массива можно присвоить значение:
$myarray[0] = harry $myarray[1] = potter
- Увеличить\уменьшить элемент массива на единицу:
macro Counter { $counterArray[1] = 0 log Значение элемента \$counterArray[1]: $counterArray[1] $counterArray[1]++ log Новое значение: $counterArray[1] $counterArray[1]-- log Прежнее значение: $counterArray[1] }
- В консоли увидим:
[eventmacro message] Значение элемента $counterArray[1]: 0 [eventmacro message] Новое значение: 1 [eventmacro message] Прежнее значение: 0
- Удаление элемента массива:
macro undef { $var[5] = 1 log значение элемента \$var[5]: $var[5] $var[5] = undef # также можно использовать 'unset' log значение элемента \$var[5] теперь уничтожено: $var[5] }
- В консоли увидим:
[eventmacro message] значение элемента $var[5]: 1 [eventmacro message] значение элемента $var[5] теперь уничтожено:
- Функции для работы с массивами
- Существует четыре фнкции, которые предназначены для работы с массивами:
- push: добавляет элемент в конец массива, увеличивая таким образом длину массива на единицу.
- pop: убирает элемент из конца массива, уменьшая таким образом длину массива на единицу.
- shift: убирает первый элемент массива, сдвигая таким образом все остальные элементы массива влево, ближе к началу и уменьшает на единицу длину массива.
- unshift: добавляет новый элемент в начало массива и сдвигает все остальные элементы вправо, ближе к концу массива, увеличивает длину массива на 1.
- &push(@array, newmember)
- Функции &push требуется два аргумента: массив и его новый элемент.
- Пример создания массива с помощью функции &push:
macro print_names { &push(@monsters, Поринг) &push(@monsters, Волк) &push(@monsters, Мая) log Массив \@monsters состоит из @monsters элементов: $monsters[0], $monsters[1] и $monsters[2] }
- В консоли увидим:
[eventmacro message] Массив @monsters состоит из 3 элементов: Поринг, Волк и Мая
- &pop(@array)
- Функция &pop принимает только один аргумет - массив, из которого надо вытолкнуть последний элемент.
- Вот пример массива в котором сначало было три элемента, а потом из него вытолкнули два последних элемента и остался только один:
macro pop { @jobs = (нуб, вор, охотник) log Массив \@jobs состоит из @jobs элементов: $jobs[0], $jobs[1] и $jobs[2] &pop(@jobs) log Теперь массив \@jobs состоит из @jobs элементов: $jobs[0], $jobs[1] &pop(@jobs) log Теперь массив \@jobs состоит из @jobs элементов: $jobs[0] }
- В консоли увидим:
[eventmacro message] Массив @jobs состоит из 3 элементов: нуб, вор и охотник [eventmacro message] Теперь массив @jobs состоит из 2 элементов: нуб, вор [eventmacro message] Теперь массив @jobs состоит из 1 элементов: нуб
- shift
Синтаксис:
&shift(@array)
Функции shift нужен только один аргумент - массив, который надо сдвинуть влево. Вот что происходит с массивом после функции shift:
@jobs = (teacher, doctor, seller) log The array \@jobs has size @jobs and its members are $jobs[0], $jobs[1] and $jobs[2] &shift(@jobs) log The array \@jobs has size @jobs and its members are $jobs[0], $jobs[1] &shift(@jobs) log The array \@jobs has size @jobs and its members are $jobs[0]
Вывод на консоли:
[eventmacro message] The array @jobs has size 3 and its members are teacher, doctor and seller [eventmacro message] The array @jobs has size 2 and its members are doctor, seller [eventmacro message] The array @jobs has size 1 and its members are seller
Функция shift весь массив сдвигается влево, т.е. после первого сдвига элемент 'seller' переместится с индекса 2 на 1, а после второго сдвига получит индекс 0.
- unshift
Синтаксис:
&unshift(@array, newmember)
Функция unshift требует два аргумента - массив и его новый элемент, который после сдвига массива вправо попадёт на освободившееся место в начале.
Вот пример создания массива с использованием функции unshift:
&unshift(@foods, bread) &unshift(@foods, carrot) &unshift(@foods, apple)
В итоге получится такой массив:
(apple, carrot, bread)
Обратите внимание, что так как unshift сдвигает массив вправо, то последний добавленный элемент 'apple', оказывается на первом месте.
А вот пример макроса:
macro print_names { @array = (apple, banana) log The array \@array has size @array and its first member is $array[0], and the second is $array[1] &unshift(@array, pineapple) log The array \@array has size @array and its first member is $array[0], and the second is $array[1] &unshift(@array, melon) log The array \@array has size @array and its first member is $array[0], and the second is $array[1] }
Вывод на консоль:
[eventmacro message] The array @array has size 2 and its first member is apple, and the second is banana [eventmacro message] The array @array has size 3 and its first member is pineapple, and the second is apple [eventmacro message] The array @array has size 4 and its first member is melon, and the second is pineapple
Хэш
Чтобы инициализировать переменную типа хэш, нужно в круглых скобках прописать через запятую список пар ключ => значение:
%variable = (key1 => value1, key2 => value2, key3 => value3)
Чтобы обратиться к элементу хэша, нужно использовать знак $ вместо % и в фигурных скобках { и } написать ключ:
$variable{key1}
- Ключ может состоять из букв и цифр.
Получить количество элементов (т.е. пар) в хеше:
%variable
macro Hello { %ages = (john => 25, george => 32) log John is $ages{john} years old, and George is $ages{george} years old }
Вывод на консоль:
[eventmacro message] log John is 25 years old, and George is 32 years old
- Элементы хеша - это обычные скаляры.
Элементу хеша можно присвоить значение:
$name{first} = harry $name{last} = potter
Элемент хеша можно увеличить на единицу и на единицу же уменьшить:
macro Counter { $hash{monterskilled} = 0 log \$hash{monterskilled} is at $hash{monterskilled} $hash{monterskilled}++ log Now it's $hash{monterskilled} $hash{monterskilled}-- log It's back to $hash{monterskilled} }
Элемент хеша можно уничтожить, присвоив ему специальное слово undef или unset:
$myhash{value} = 1 log \$myhash{value} is $myhash{value} $myhash{value} = undef # or you can use 'unset' log \$myhash{value} now vanished: $myhash{value}
Для хеша есть функция delete, которая удаляет ключ из хеша, как если бы его и не было. There's one hash keyword, delete, which completely deletes a key from a hash, as if it had never existed.
Пример вызова функции delete:
&delete($names{john})
Пример макроса:
macro print_names { %fruitsprice = (apple => 1000, banana => 700) log The hash \%fruitsprice has size %fruitsprice. log The apple price is $fruitsprice{apple} and the banana price is $fruitsprice{banana} &delete($fruitsprice{apple}) log The hash \%fruitsprice has size %fruitsprice. log The price of banana is: $fruitsprice{banana} log The price of apple has vanished: $fruitsprice{apple} }
Вывод на консоль:
[eventmacro message] The hash \%fruitsprice has size 2. [eventmacro message] The apple price is 1000 and the banana price is 700 [eventmacro message] The hash \%fruitsprice has size 1. [eventmacro message] The price of banana is 700 [eventmacro message] The price of apple has vanished: