воскресенье, 6 ноября 2022 г.

Mikrotik script странности функций и массивов

 Привык использовать функции не только для повторяющихся задач, но и для массивных кусков кода. Например мне нужно сформировать строку с OID из массива и передать ее по ssh, я конечно могу ее сформировать прямо внутри блока, но такая политика сделает код менее читабельным. И вот тут у скрипта Mikrotik возникает проблема - функции должны быть глобальными. Стараюсь по минимуму использовать глобальный контекст, но вызвать локальную функцию из локальной функции нельзя. Только глобальную. Даже с передачей в локальной переменной именованного массива (:local MyVar{"X"="Y";"Y"="Z"}) бывают проблемы. Поэтому приходится использовать глобальный контекст. Не забываем для глобального контекста внутри функции объявлять функцию/переменную в глобальном контексте (я бы назвал не объявлять, а инициализировать, она как бы есть, но функция о ней ничего не знает, но на сайте микротика написано declared).

Не работает:

:global MyVar 0

:local MyFunc do={
	:put $MyVar
}

$MyFunc

работает:

:global MyVar 0

:local MyFunc do={
	:global MyVar
    :put $MyVar
}

$MyFunc

Не работает:

:local MyFunc2 do={
	:return ($1+$2)
}

:local MyFunc do={
	:return ([$MyFunc2 $a $b])
}

:put [$MyFunc a=2 b=3]

работает:

:global MyFunc2 do={
	:return ($1+$2)
}

:local MyFunc do={
	:global MyFunc2
	:return ([$MyFunc2 $a $b])
}

:put [$MyFunc a=2 b=3]

Собственно если внимательно прочитать это, то таких проблем возникать не должно

Комментариев нет:

Отправить комментарий