Некоторые картинки не загружаются из РФ и РК, используйте VPN.

понедельник, 19 декабря 2022 г.

Mikrotik script обход параметров функции

 Предположим ситуация - необходимо обработать N слов, каждое слово является позиционным параметром некоей функции, сколько слов может быть на входе мы не знаем, но предполагаем что не больше 10. Каким образом обработать параметры? Сначала я подумал о преобразовании текста в код в цикле и обработки его при помощи :parse или :execut как предлагает доблестный rextended:

:global variablename "test"

# Create a global variable using the name inside "variablename" and set the value (or update the value if is already defined)
[:parse ":global $variablename \"REX1\""]
# after "parse" the variable exist and can be displayed
:put $test

# Set a value of variable with name defined inside "variablename" (or simply apply previous "parse" command)
[:parse "global $variablename;:set $variablename \"REX2\""]
:put $test

# For read the value, of a variable with name defined inside "variablename", and put it inside another global or local declared variable:
:global testx [[:parse ":global $variablename; :return \$$variablename"]]
:put $testx

# For read the value, of a variable with name defined inside "variablename", simply for put the value on terminal:
:put [[:parse ":global $variablename; :return \$$variablename"]]

Но, в случае с позиционными параметрами, вариант не прокатил, чет думал-думал (внутренний диалог):

"Вот бы знать сколько их там, в bash то мы знаем"
"Да какая разница сколько их там, все равно цикл с формированием имени переменной не использовать"
"Тогда забей и юзай условной блок с :return"
"Нет, это решение громоздкое и не красивое!....Эврика!, рекурсия со сдвигом параметров!"

И таки да, такой вариант, хоть и ограничен некоторым N, но изящнее и работает:

:global CreateTree do={
	:global CreateTree
	if ([:len $1]>0) do={
		:put $1
		$CreateTree $2 $3 $4 $5 $6 $7 $8 $9
	}
}

$CreateTree "test1" "test2" "test3" "test4"
# waiting, while func appear in list of global environment, else we get error when to try remove her
:delay 1
/system script environment remove CreateTree

Подразумевается что все позиционные параметры текстовые, хоть явного опроса и нет. Я использовал этот подход в формирования структуры каталогов на самом Mikrotik.

Удаление глобальных можно доверить функции удаления всех глобальных

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

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