eventMacro

Материал из Руководство по OpenKore
Перейти к навигации Перейти к поиску

Переменные

  • Есть возможность работать с переменными. Объявлять переменные не нужно. Все переменные макросов - глобальные, т.е. переменная из одного макроса может быть использована в другом макросе.
  • Система переменных в eventMacro основывается на типах данных языка Perl. Переменные могут быть скалярами, массивами и хешами.
  • В названии переменной можно использовать только буквы и цифры.
  • Если Вы хотите использовать какую-либо переменную без подстановки её значения, то следует экранировать её с помощью "\" (например, \$var).

Типы переменных

Скаляр
  • Скалярная переменная содержит только одну величину, например, число и\или текст.
  • Скалярные переменные начинаются со знака $.
Массив
  • Переменная массив содержит список величин (элементов).
  • У каждого элемента в массиве есть свой индекс, который указывает на позицию в списке.
  • Первый элемент массива имеет индекс 0, а последний - длина массива минус один.
  • Массивы начинаются со знака @.
Хэш
  • Переменная хэш содержит пары величин.
  • Каждая пара состоит из ключа и значения.
  • Каждый ключ имеет только одно значение, но несколько ключей могут иметь одинаковые значения.
  • Хэши начинаются со знака %.

Объявление и использование

Скаляр
  • Присвоить переменной значение: $variable = значение
  • Получить значение переменной (НО это касается только макросов, для автомакросов есть другой синтаксис, как и для параметров конфига и т.п.): $variable
macro Hello {
   $var = Hello
   $var1 = World!
   log $var $var1
}
Данный макрос выведет на консоль:
[eventmacro message] Hello World!
  • Увеличить на 1 значение переменной: $variable++ или уменьшить $variable--.
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] теперь уничтожено:
Функции для работы с массивами
Существует четыре фнкции, которые предназначены для работы с массивами:
  1. push: добавляет элемент в конец массива, увеличивая таким образом длину массива на единицу.
  2. pop: убирает элемент из конца массива, уменьшая таким образом длину массива на единицу.
  3. shift: убирает первый элемент массива, сдвигая таким образом все остальные элементы массива влево, ближе к началу и уменьшает на единицу длину массива.
  4. 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: